実践 PSR-4 クラスをspl_autoloaderを使ってautoloadしてみる最も簡単なサンプル

PSR-4の一次情報を読んだことだし、現在の理解でPSR-4 Autoloadに対応したクラスを作成し実際にAutoloadしてみる。composerもPSR-4に対応しているが、まずはPHP-Figがサンプルとして公開しているspl_autoloaderを使った例を試すことにする。

仕様は以下の通り。

Fully qualified class name \ikuty\example\Psr4\HelloWorld
Namespace Prefix \ikuty\example\Psr4
Base Directory ./src/ikuty/example/Psr4
Resulting file path ./src/ikuty/example/Psr4/helloworld.php

サンプルクラスの作成

./src/ikuty/example/Psr4/helloworld.phpを以下の通り作成する。

呼出側の作成(PSR-0的)

PHP Figにあるクロージャ版spl_autoloaderを使った実装例を試してみる。
\ikuty\example\Psr4\HelloWorldをnew()すると、spl_autoload_registerで登録したクロージャが評価される。

なお、名前空間の深さとBaseDirectoryの深さ等しくしている意味でPSR-0的なサンプル。

名前空間プレフィックスとBaseDirectoryの紐づけは結局人力でやっている。「名前空間プレフィックス」と「クラス名」の間にある「サブ名前空間」を読み飛ばしている。名前空間プレフィックスに続く「サブ名前空間」分をクラス側が自由に使えるところが興味深い。

実行結果

実行してみる。実行結果から分かりにくくて恐縮だが、new()してもHello World!は出力されず、say()メソッドを実行したときにHello World!が2回表示された。late-binding的な感じ。

名前空間の深さと関係なくBaseDirectoryを設定する(PSR-4的)

例えば、\ikuty\example\Psr4\HelloWorldの名前空間プレフィックス\ikuty\example\Psr4をBaseDirectory ./ikuty-example-psr4 に紐づければ、名前空間がどれだけ深くてもデプロイは影響を受けない。

Fully qualified class name \ikuty\example\Psr4\HelloWorld
Namespace Prefix \ikuty\example\Psr4
Base Directory ./src/ikuty-example-Psr4
Resulting file path ./src/ikuty-example-Psr4/helloworld.php

結論

  • PHP-Figがサンプルとして提供しているspl_autoloader(クロージャ版)をお試し実装してみた。
  • PSR-4は名前空間プレフィックスのベースディレクトリの関連を記述する仕様であり、ベースディレクトリの物理的な配置が名前空間プレフィックスに直接影響を受けない。
  • ベースディレクトリが深くならなくて良い

シェアする

  • このエントリーをはてなブックマークに追加

フォローする