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();
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;