spl_autoload_register自動載入介紹
最經常使用的就是這種方法,根據類名,找出類檔案,然後require_once
function __autoload($class_name) {
$path = str_replace('_', '/', $class_name);
require_once $path . '.php';
}
// 這裡會自動載入Http/File/Interface.php 檔案
$a = new Http_File_Interface();
這種方法的好處就是簡單易使用。當然也有缺點,缺點就是將類名和檔案路徑強制做了約定,當修改檔案結構的時候,就勢必要修改類名。
__autoload的最大缺陷是無法有多個autoload方法
好了, 想下下面的這個情景,你的專案引用了別人的一個專案,你的專案中有一個__autoload,別人的專案也有一個__autoload,這樣兩個__autoload就衝突了。解決的辦法就是修改__autoload成為一個,這無疑是非常繁瑣的。
因此我們急需使用一個autoload呼叫堆疊,這樣spl的autoload系列函式就出現了。你可以使用spl_autoload_register註冊多個自定義的autoload函式
例如:
A.php
<?php
class A
{
public function __construct()
{
echo 'Got it A.';
}
}
B.php
<?php
class B
{
public function __construct()
{
echo 'Got it B.';
}
}
?>
test.php
<?php
function __autoload($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
$a = new A();
$b = new B();
執行可以得到:Got it A.Got it B.
還有一種寫法:
<?php
class Loader
{
public static function loadClass($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
}
spl_autoload_register(array('Loader', 'loadClass'));
$a = new A();