LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 1 year has passed since last update.

autoloaderについて

Last updated at Posted at 2022-07-21

spl_autoload_register('callback');

  • try{}catch(){}と同じ感覚
  • この関数以降で 読み込みされていない クラスを new した場合 自動で登録したコールバック関数を実行してくれ。
  • コールバック関数の引数にはnewしたクラス名を自動で渡してくれる。
lessons\ABC.php
<?php
class ABC {
    public function __construct()
    {
        echo 'ABCが見つかりました';
    }
}
<?php
spl_autoload_register('loadClass');
// ここ以降が対象

//コールバック関数
function loadClass($classname)
{
  echo $classname; // new クラス名 <- クラス名が取得できるだけ。
}
// ABCクラスが存在しないのに new した。
$abc = new ABC();
  • 結果 ABC が echo されて、エラーがでている。
    • コールバック関数が走った後に改めて例外が発生する。
      image.png
  • コールバック関数を使って クラス名を読み込みさせる。
function loadClass($classname)
{
//  echo $classname;
//+
    $php_file = __DIR__ . '/' .'lessons'.'/'.$classname.'.php';
    if (is_readable($php_file)) {
//  $php_file = __DIR__./lessons/ABC.php
        require_once $php_file;
        return;
    }
}

コールバックにインスタンスのメソッドを登録する場合

  • spl_autoload_register(array(インスタンス,'コールバックメソッド'));
class someClass {

  function someCallback() 
  {
  }

}

$anObject = new someClass();

// コールバック関数にインスタンスのメソッドを登録する場合
// 引数は配列で渡す必要がある。
spl_autoload_register(array($anObject, 'someMethod'));
// 普通は クラス内で使うため $this を使う
spl_autoload_register(array($this, 'someMethod'));

autoloadクラス

  • オートロードするためのプロパティとメソッドを集めたクラス
<?php
/** perfectPHP
 * @author Katsuhiro Ogawa <fivestar@nequal.jp>
 */

class ClassLoader
{
// オートロードで調べるディレクトを格納する変数
    protected array $dirs;
// オートロード実行メソッド
    public function register()
    {
// loadClassメソッドを実行する
        spl_autoload_register(array($this, 'loadClass'));
    }

// 探索するディレクトリを登録
    public function registerDir($dir)
    {
        $this->dirs[] = $dir;
    }
// 未定義のクラスをnewした場合呼び出される
// $classはその時のクラス名
    public function loadClass($class)
    {
// 登録していたディレクトリにインスタンス化しようとしたクラスファイルが存在しているか確認
        foreach($this->dirs as $dir){
            $file = $dir. '/' . $class . '.php';
// 存在していればrequireし、未定義エラーを回避
            if(is_readable($file)){
                require $file;

                return;
            }
        }
    }
}
  • フロントコントローラーやbootstrap.phpで実行されることが多い
bootstrap.php
<?php
/** perfectPHP
 * @author Katsuhiro Ogawa <fivestar@nequal.jp>
 */

require 'core/ClassLoader.php';

$loader = new ClassLoader();
$loader->registerDir(dirname(__FILE__).'/core');
$loader->registerDir(dirname(__FILE__).'/models');
$loader->register();
web/index.php (フロントコントローラー)
require '../bootstrap.php';

// core/Sample1.php
// models/Sample2.php
$sample1 = new Sample1;
$sample2 = new Sample2;
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up