1. __autoload
這是乙個自動載入函式,在php5中,當我們例項化乙個未定義的類時,就會觸發此函式。看下面例子:
./myclass.php
class myclass {
public function __construct() {
echo "myclass init'ed successfuly!!!";
./index.php
// we've writen this code where we need
function __autoload($classname) {
$filename = "./". $classname .".php";
include_once($filename);
// we've called a class ***
$obj = new myclass();
從上面能看到這是兩個檔案,下面的index.php 中,new了個 myclass類,但是明顯本檔案不存在,現在就會自動呼叫 __autoload函式,並 把 「myclass」這個類名字串 直接作為引數傳給__autoload, 此時自動載入函式內部就可以引入該檔案了,引入後就正常初始化該類了。 該函式在php 7.2.0後被廢棄了。
2. spl_autoload_register
spl_autoload_register 可以將 函式自動註冊,也就是說,當php檔案內訪問了乙個不存在的類時,會自動去呼叫該函式,然後執行該函式內部的函式,看起來和 autoload的作用是一樣的。但是其實spl_autoload_register 這個函式功能更強大, autoload的引數 僅僅是乙個函式名,這是定死的。並且只能宣告一次, 使用了autoload後,就不能再次使用該函式了。
請注意:乙個專案中只能有乙個__autoload, 如果在php在執行過程中遇到兩個__autoload會直接報錯的。
很明顯,autoload無法滿足要求, 所以就有了spl擴充套件,spl_autoload_register接受函式名或閉包,或陣列作為引數,在閉包內部,即可引入對應的檔案了。並且spl_autoload_register可以註冊乙個 自動載入佇列,先註冊的,先呼叫。
引數autoload_function
欲註冊的自動裝載函式。如果沒有提供任何引數,則自動註冊 autoload 的預設實現函式spl_autoload()。
throw
此引數設定了 autoload_function 無法成功註冊時, spl_autoload_register()是否丟擲異常。
prepend
如果是 true,spl_autoload_register() 會新增函式到佇列之首,而不是佇列尾部。
可以結合require_once一起使用。如:
function_1(){
$clsname = str_replace("\\",directory_separator, $class_name);
if (is_file(__dir__.directory_separator."src".directory_separator.$clsname . '.php')) {
//檔案內部有類名 為 testclass_1的類
require_once(__dir__.directory_separator."src".directory_separator.$clsname.'.php');
function_2(){
$clsname = str_replace("\\",directory_separator, $class_name);
if (is_file(__dir__.directory_separator."module".directory_separator.$clsname . '.php')) {
//檔案內部有類名為testclass_2的類
require_once(__dir__.directory_separator."module".directory_separator.$clsname.'.php');
spl_autoload_register('function_1');
spl_autoload_register('function_2');
$obj = new testclass_2(); //當前沒有testclass_2這個類,於是自動呼叫function_1, 引入了檔案,但是引入的檔案中仍然沒有testclass_2這個類,於是又自動呼叫function_2, 引入了檔案,此時正常初始化
3.相關的其他spl函式
3.1 spl_autoload_call
該函式是需要使用者顯示呼叫所有已註冊的 autoload函式的。 作用在 spl_autoload_register之後。 傳入函式名字即可。即可手動引入檔案了。
3.2 spl_autoload_functions
可以獲取到所有已經註冊的autoload函式, 也是作用在 spl_autoload_register之後的。
3.3 spl_autoload_extensions
註冊並返回spl_autoload函式使用的預設副檔名, 但是此介面和spl_autoload函式,用處不大。spl_autoload 是autoload的預設實現,意思就是spl_autoload對autoload進行了又一次封裝,在預設情況下,本函式先將類名轉換成小寫,再在小寫的類名後加上 .inc 或 .php 的副檔名作為檔名,然後在所有的包含路徑(include paths)中檢查是否存在該檔案。
__autoload 函式是用來處理自動載入的函式,在 php 找不到指定類時就會去呼叫自動載入類,載入所需要的類。
__autoload 只是乙個抽象定義,實現(實現就是定義如何載入,載入的規則是什麼,載入的檔案是什麼等等)是交給使用者的,而 spl_autoload 則是 spl 所定義的 autoload 一種實現。spl_autoload 函式所實現的載入規則就是去 include paths 中查詢對於的類。spl_autoload 遵循是是 psr-0 的載入規則,而 include paths 就是載入時被查詢的路徑。
其他自己實現的 autoload 類都可以通過 spl_autoload_register 進行註冊,註冊之後就可以在需要類時自動呼叫被註冊的方法進行載入了。 spl_autoload 也是 autoload 的一種實現,按理也是需要註冊的,只不過因為是內部的預設實現,所有已經自動註冊在 php 裡了。
spl_autoload 如今來看並沒有太多用處,應該是因為歷史問題殘留在 php 中的,目前絕大多數程式都沒有使用 spl_autoload 去做自動載入,因為它的規則已經定死,並不適合衍生一些功能。
因為 php 只有乙個自動載入方法,所以 spl 的 spl_autoload 和 spl_autoload_register 要爭搶這個方法,所以在 spl 的 c 實現中,用了好多折衷的辦法。在沒有使用 spl_autoload_register 註冊任何自定的自動載入函式時, php 的自動載入方法是掛在 spl_autoload 下的,而 spl_autoload_register 註冊了自動載入函式後,php 的自動載入方法是掛在 spl_autoload_call 這個方法下的,而 spl_autoload 也會成為乙個備選項進入 spl_autoload_register 的自動載入佇列。
PHP SPL擴充套件學習筆記
一.spl是幹嘛的 spl是用於解決典型問題 standard problems 的一組介面與類的集合。資料結構 1.實現雙向列表 spldoublylinkedlist implements iterator arrayaccess countable 2 splstack extends spl...
php SPL學習筆記
宣告 此文只是對spl的認識有乙個初步的記載,並沒有對spl的詳細用法給出 解釋。1.什麼是spl 官方給出的解釋 spl是用於解決典型問題 standard problems 的一組介面與類的集合。當然這樣有點抽象。具體有什麼作用呢?典型問題又是什麼呢?經過研究文件,發現其實就是對常用的功能進行了...
PHP SPL,遺落的寶石
英文原文 standard php library spl spl,php 標準庫 standard php library 此從 php 5.0 起內建的元件和介面,並且從 php5.3 已逐漸的成熟。spl 其實在所有的 php5 開發環境中被內建,同時無需任何設定。似乎眾多的 php 開發人員...