1. 程式人生 > >PHP類的自動載入

PHP類的自動載入

__autoload

嘗試載入未定義的類,PHP7.2棄用此函式。假定同一目錄下有foo.php和test.php兩個檔案。

PHP5.3以前__autoload函式丟擲的異常不能被catch語句塊捕獲並會導致一個致命錯誤。PHP5.3起能夠thrown自定義的異常,隨後自定義異常類即可使用。__autoload函式可以遞迴的自動載入自定義異常類。

//foo.php
<?php
class Foo{
	function __construct(){
		echo __CLASS__ ." in ". __FILE__ ."<br/>";
	}
}

class Bar{
	function __construct(){
		echo __CLASS__ ." in ". __FILE__ ."<br/>";
	}
}
interface ITest{
	public function test();
}
?>
//test.php
<?php
function __autoload($className){
    $filename = "./". $className .".php";
    include_once($filename);
}
$foo=new Foo();
$bar=new Bar();
?>

要注意的是如果test.php中最後兩行順序顛倒的話會產生致命錯誤,因為Bar定義在foo.php中,無法通過__autoload載入。

spl_autoload_register

將函式註冊到SPL的__autoload函式佇列中。如果該佇列中的函式尚未啟用,則啟用它們。spl_autoload_register建立了一個autoload函式的佇列,按定義時的順序逐個執行。而__autoload函式只可以定義一次。如果程式中已經實現了__autoload函式,必須顯式的將其註冊到__autoload函式佇列中。因為spl_autoload_register函式會將Zend Engine中的__autoload函式取代為spl_autoload或spl_autoload_call。

最多接受三個引數,第一個引數為要註冊的自動裝載函式,預設為spl_autoload();第二個引數為要註冊的自動裝載函式無法成功註冊時,spl_autoload_register是否丟擲異常,預設為true;第三個引數為PHP5.3新增的標識引數,表示要註冊的自動裝載函式是否新增到函式佇列之首,預設為false。註冊成功返回true,失敗返回false。

PHP5.3起,還支援匿名函式和名稱空間。

//test2.php
<?php
function my_autoload($className){
	$filename = "./". $className .".php";
    include_once($filename);
}
spl_autoload_register('my_autoload');

//PHP5.3支援匿名函式
spl_autoload_register(function($className){
	$filename = "./". $className .".php";
    include_once($filename);
},true,true);


$foo=new Foo();
$bar=new Bar();

class MyTest implements ITest{
	public function test(){
		echo "mytest</br>";
	}
}
$t=new MyTest();
$t->test();
?>
//test3.php
<?php
namespace ns;

function my_autoload($className){
	$filename = "./". $className .".php";
    include_once($filename);
}
spl_autoload_register(__NAMESPACE__ .'\my_autoload');

$foo=new \Foo();
$bar=new \Bar();

?>