質問: 自習のために、クラスのautoloaderを実装してみようと思い、参考にComposerのautoloadのソースコードを調べています。Composerを生成された`vendor/composer/auload_read.php`の中で以下のコードが記述されていました。 ``` call_user_func(\Composer\Autoload\ComposerStaticIniteabfb31ac75b7f62959148f5cfd8b9da::getInitializer($loader)); ``` このcall_user_func()はどういった用途で使用されているのでしょうか? 試しにcall_user_func()を外して`ComposerStaticInitxxx::getInitializer($loader)`を直接呼び出すと、autoloadが正常に機能しないようでした。 call_user_func()はコールバック関数を呼び出す機能でしかなく、`CompposerStaticInit::getInitializer()`ただのpublic なstaticメソッドとして定義されており、何の意味があるのか、なぜ使用しないとautoloadが機能しないのかがわかりません。
回答: call_user_func() > > 最初の引数で指定したコールバック関数をコールする > > > ということなので、 call_user_func()の第一引数にはコールバック関数を第2引数以降はコールバック関数に渡す引数を呼び出します。 ``` prefixLengthsPsr4 = ComposerStaticInitXXXXXX::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInitXXXXXX::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInitXXXXXX::$prefixesPsr0; $loader->classMap = ComposerStaticInitXXXXXX::$classMap; }, null, ClassLoader::class); } ``` ハッシュ化された静的クラスの変数をloaderの変数に渡したいようですね。 autoload_read.phpは関数を使うタイミングの責任を持ちたい。 autoload_static.phpは関数の実装の責任を持ちたい。 なのでコールバックを用いた実装になっているようです。 またなぜ無名関数をつかうかというと、その通り命名しなくてよいからですね。 特定の個所から一度しか呼ばれないコールバックであれば、わざわざ命名して管理すると手間なので 無名関数でやり取りしたりします。 あとはコールバック/CallableやClosureクラスあたりを学ぶとよいと思います。