PHP類的自動載入
阿新 • • 發佈:2018-12-15
__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();
?>