自動載入就是當我們在當前檔案中例項化乙個不存在的類時,呼叫自動載入機制引入相應的類檔案。
注:自動載入有兩種方式(都是php內建的),一種是通過__autoload(),另一種是通過spl_autoload_register()。
以下兩種方式的介紹中,都是執行test3.php檔案。
/data/www/test2/test2.php
<?php
class test2
static function bb()
}
/data/www/test3.php
<?php
//載入過程
//1、例項化test2類,由於當前檔案不存在test2類,所以會自動執行__autoload()方法,並自動將類名傳過去
//2、執行完__autoload()方法之後,會載入test2/test2.php檔案
//3、由於當前檔案已經通過__autoload()方式require進檔案test2.php了,所以也就可以呼叫test2.php中的方法了
$test = new test2();
$test->aa();//呼叫aa方法
test2::bb();//呼叫bb靜態類方法
function __autoload($class)
注:由於__autoload()自動載入方式已經逐漸被php官方廢棄了,所以這裡採用另一種方式spl_autoload_register來實現。
這裡,test2.php檔案和上面一樣,只改變test3.php檔案。
/data/www/test3.php
<?php
//載入過程
//1、例項化test2類時,由於當前檔案並沒有test2類,所以php會自動呼叫spl_autoload_register自動載入機制
//2、呼叫spl_autoload_register,就會呼叫我們自己定義的autoload_test()方法
//3、進而引入了相應的test2.php類檔案
//4、引入了相應的類檔案之後,自然也就可以例項化類,並呼叫相應的方法了
spl_autoload_register(autoload_test);
$test = new test2();
$test->aa();//呼叫aa方法
test2::bb();//呼叫bb靜態類方法
/** * 用於實現自動載入
* @param $class
*/function autoload_test($class)
spl_autoload_register()相比於__autoload()的優點在於:
(1)可以按需多次寫spl_autoload_register註冊載入函式,載入順序按誰先註冊誰先呼叫。__aotuload由於是全域性函式只能定義一次,不夠靈活。
比如下面,由於需要同時載入test2.php 以及 test4.class.php,__autoload就實現不了這個需求,而使用spl_autoload_register來實現就比較合適。
test4.class.php
<?php
class test4
}
test3.php
<?php
//載入過程
//1、例項化test2類時,由於當前檔案並沒有test2類,所以php會自動呼叫spl_autoload_register自動載入機制
//2、呼叫spl_autoload_register,就會呼叫我們自己定義的autoload_test()方法
//3、進而引入了相應的test2.php類檔案
//4、之後又例項化了test4類,test4類在當前檔案同樣沒有,這時php會自動呼叫spl_autoload_register自動載入機制
首先呼叫第乙個註冊自動載入函式spl_autoload_register(autoload_test),載入之後沒有找到test4類
所以php會繼續呼叫第二個自動註冊函式spl_autoload_register(autoload_test4)
這時,終於找到test4類了,也就不用繼續在往下找了
//5、引入了相應的類檔案之後,自然也就可以例項化類,並呼叫相應的方法了
spl_autoload_register(autoload_test);
spl_autoload_register(autoload_test4);
$test = new test2();
$test->aa();//呼叫aa方法
test2::bb();//呼叫bb靜態類方法
$test4 = new test4();
$test4->dd();
/** * 用於實現自動載入
* @param $class
*/function autoload_test($class)
function autoload_test4($class)
(2)spl_autoload_register()可以被catch到錯誤,而__aotuload不能。
(3)spl_autoload_register註冊的載入函式可以按需被spl_autoload_unregister掉
還有,值得注意的是,如果對類檔案加入了命名空間,就必須保證正確的載入了類檔案的同時,還要通過use引入對應的命名空間。
php自動載入機制的實現
自動載入就是當我們在當前檔案中例項化乙個不存在的類時,呼叫自動載入機制引入相應的類檔案。注 自動載入有兩種方式 都是php內建的 一種是通過 autoload 另一種是通過spl autoload register 以下兩種方式的介紹中,都是執行test3.php檔案。data www test2 ...
PHP自動載入機制
自動載入機制的主要執行過程 1 檢查執行器全域性變數函式指標autoload func是否為null。2 如果autoload func null,則查詢系統中是否定義有 autoload 函式,如果沒有,則報告錯誤並退出。3 如果定義了 autoload 函式,則執行 autoload 嘗試載入類...
php 自動載入機制
一 基礎了解。1 php引入檔案使用include與require,這兩個的區別在於,include可以在 執行過程中再引入,而require是需要在 執行前就進行引入操作。2 命名空間。引入命名空間的作用是為了規避掉因為重名而引發的混亂與錯誤。可以把命名空間理解為乙個箱子,不同的箱子都可以有蘋果,...