[PHP]spl_autoload函式棧的向下遍歷機制
阿新 • • 發佈:2022-04-10
問題
倘若利用spl_autoload_register註冊多個autoload_function,spl_autoload機制在自動載入的時候是否會由上至下把所有註冊的函式執行一遍呢?
真相
看看如下例子:
<?php function autoload_01() { var_dump("autoload_01"); spl_autoload("foo"); } function autoload_02() { var_dump("autoload_02"); spl_autoload("foo"); } spl_autoload_register("autoload_01"); spl_autoload_register("autoload_02"); new foo();
假設當前include目錄下存在foo,那麼輸出結果如下:
/mnt/hgfs/lroot/www/10002/test_51.php:4:string 'autoload_01' (length=11)
即使把spl_autoload函式換成include,效果也是一樣的:
<?php function autoload_01() { var_dump("autoload_01"); include("foo.php"); } function autoload_02() { var_dump("autoload_02");include("foo.php"); } spl_autoload_register("autoload_01"); spl_autoload_register("autoload_02"); new foo();
但是如果當前include_path不存在foo,那麼輸出結果就會如下:
/mnt/hgfs/lroot/www/10002/test_51.php:4:string 'autoload_01' (length=11) /mnt/hgfs/lroot/www/10002/test_51.php:9:string 'autoload_02' (length=11) Fatal error: Uncaught Error: Class 'foo' not found in ?.php on line ?
以上說明當其中一個註冊函式找到類檔案,則不再執行餘下註冊函式,否則繼續執行下面的註冊函式,直到找到類為止。
那麼,讓註冊函式返回布林值是否能阻止函式繼續向下執行呢?答案是不能。
修改一下以上例子:
<?php function autoload_01() { var_dump("autoload_01"); return true; //return false; } function autoload_02() { var_dump("autoload_02"); } spl_autoload_register("autoload_01"); spl_autoload_register("autoload_02"); new foo();
無論autoload_01返回TRUE還是FALSE,都不影響PHP往下執行autoload_01:
/mnt/hgfs/lroot/www/10002/test_51.php:4:string 'autoload_01' (length=11)
/mnt/hgfs/lroot/www/10002/test_51.php:10:string 'autoload_02' (length=11)
Fatal error: Uncaught Error: Class 'foo' not found in ? on line ?