當實例化一個不存在的類的時候,PHP會嘗試去加載它。好比目錄下有一個test的類,它保存在test.php中。在index中,若是沒有包含test.php進來,那麼實例化test類的時候便會調用__autoload
嘗試將test類加載進來。php
test.phphtml
<?php函數
class test{ui
public fucntion index(){spa
echo "hello word";.net
}code
}htm
index.php接口
<?php隊列
header('Content-Type:text/html;charset=urf-8');
function __autoload($class){
echo '你正在嘗試加載' . $class;
require $class . '.php';
}
new test();
運行結果會輸出你正在嘗試加載test
,而且不會出現任何的問題。另外自動加載函數的參數 $class 是實例化類的類名。
spl_autoload_register() - 註冊給定函數做爲 __autoload 的實現
官方解釋:
spl_autoload_register ([ callable $autoload_function
[, bool $throw
= true [, bool $prepend
= false ]]] ) : bool
參數:
autoload_function 欲註冊的自動裝載函數。若是沒有提供任何參數,則自動註冊 autoload 的默認實現函數spl_autoload()。
throw
此參數設置了 autoload_function
沒法成功註冊時, spl_autoload_register()是否拋出異常。
prepend
若是是 true,spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。
將函數註冊到SPL __autoload函數隊列中。若是該隊列中的函數還沒有激活,則激活它們。
若是在你的程序中已經實現了__autoload()函數,它必須顯式註冊到__autoload()隊列中。由於 spl_autoload_register()函數會將Zend Engine中的__autoload()函數取代爲spl_autoload或spl_autoload_call()。
若是須要多條 autoload 函數,spl_autoload_register() 知足了此類需求。 它實際上建立了 autoload 函數的隊列,按定義時的順序逐個執行。相比之下, __autoload() 只能夠定義一次。
那麼什麼是spl_autoload、spl_auto_load_call呢? 官方解釋:
spl_autoload - __autoload()函數的默認實現
是什麼意思呢? 當不使用任何參數調用spl_autoload_register()函數,那麼在之後進行自動加載的時候回默認調用這個函數,我的理解是給autoload函數隊列裏面添加了一個默認的函數,那麼這個函數怎麼使用呢
spl_autoload ( string $class_name
[, string $file_extensions
] ) : void (相信熟悉PHP手冊的人都會看懂的)
下面來解釋一下參數:
class_name 類名
file_extensions
在默認狀況下,本函數先將類名轉換成小寫,再在小寫的類名後加上 .inc 或 .php 的擴展名做爲文件名,而後在全部的包含路徑(include paths)中檢查是否存在該文件。
spl_autoload_call ( string $class_name
) : void — 嘗試調用全部已註冊的__autoload()函數來裝載請求類, 能夠直接在程序中手動調用此函數來使用全部已註冊的__autoload函數裝載類或接口。
參數 : calss_name 搜索的類名
下面給出一些使用示例,
複製代碼以下:
<?php// function __autoload($class) {// include 'classes/' . $class . '.class.php';// }function my_autoloader($class) { include 'classes/' . $class . '.class.php';}spl_autoload_register('my_autoloader');// 或者,自 PHP 5.3.0 起可使用一個匿名函數spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php';});?>