1. 程式人生 > >spl_autoload_register自動載入介紹

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