【PHP】オートロードについての話

おはようございます。

昨日の宣言通り、「パーフェクトPHP】の内容に沿って勉強していきたいと思います。

P.198【フレームワークによる効率的な開発】から始めていきます。

フレームワークを使うにあたって、フレームワークがどんな設計でどんな動きを知ることは非常に大切です。
中身が分からなければ、拡張性もないし、リスクについても把握することができません。
(分からないのはしょうがない部分があると思いますが、分かろうとしないのはスタートライン以前の問題ですね)

/*————————————————————————————————————*/
ということで、今日は「オートロード」についてです。

オートロード

基本的にクラスを使いたいときは、必要に応じて「require_once」などを用いてクラスを記述しているファイルを読み込みを行うと思います。

しかし、毎回毎回読み込み処理を書くのもなかなかめんどくさい部分があります。
また、読み込みを忘れて関数等を使ったときに「未定義の関数です」みたいなエラーが出ることもしばしば。。。

そこで、登場するのがオートロードという仕組みです。

内容としては、

「クラスを呼び出し際にそのクラスがPHP上に読み込まれていない場合、自動的にファイルの読み込みを行うことができるようになる」

というものです。

実装されている機能は、

PHPにオートローダクラスを登録する
②オートロードが実行された際にクラスファイルを読み込む

という機能が実装されています。

注意点としては、クラスファイルを呼び出す際にクラス名をもとに該当するファイルのパスを特定しなければならないため、ファイルの配置ディレクトリやファイル名について明確なルールを設定しなければなりません。

<?php
/*知らなかった関数など
 *spl_autoload_register()::未定義のクラスやインターフェイスを使おうとすると、自動的に呼び出す(オートローディングする)ようにする組み込み関数
 *is_readable::指定したファイル名が読み込み可能か確認
 */
class ClassLoader{

  protected $dirs;

  //オートローダクラスを登録する処理
  public function register(){
    spl_autoload_register(array($this, 'loadClass'));
  }

  //読み込むディレクトリを登録する処理
  public function registerDir($dir){
    $this->dirs[] = $dir;
  }

  //オートロード時にPHPから自動的に呼び出され、クラスファイルを読み込みを行う処理
  public function loadClass($class){
    foreach($this->dirs as $dir){
      $file = $dir.'/'.$class.'.php';
      if(is_readable($file)){
        require $file;

        return;
      }
    }
  }
}
?>

オートロードクラスを利用するためにはこんな感じでプログラムを書きます。

<?php
$loader = new ClassLoader();
$loader->registerDir(dirname(__FILE__).'/hogehoge');//hogehogeはクラスを置いているディレクトリを指定
$loader->register();//オートロードに登録
?>

「registerDir()」でオートロード先のディレクトリを設定する。(複数ディレクトリ可能)
「register()」でオートロードに登録。

これで、毎回読み込みのコードを書かなくても、自動的にクラスが読み込まれるようになります。

オートロードには「__autoload() 」があるのですが、こちらは1度しか定義できないという問題があります。
そこで、複数の関数を定義できる「spl_autoload_register()」を利用しています。

これで、require_once地獄からおさらばすることができます!!

※このブログではパーフェクトPHPの内容を引用・参考にしています。

【参考記事】
パーフェクトPHP

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)


PHPでクラスをspl_autoload_registerを使ってオートロードする - バカンス駆動開発