php autoload自動加載類

什么是__autoload?

php是腳本語言,不同于c++只需要編譯一次,php每次執行過程中都需要編譯,所以提高php編譯效率,可以提高php腳本執行速度。

每次,當你使用一個新的類時,你需要包含這個類文件,然后在new出這個類。當一個腳本中依賴了很多其他腳本中定義的類時,往往腳本的樣子如下:

/**

* 文件non_autoload.php

*/

require_once(‘your/proj/inc/A.php’);

require_once(‘your/proj/inc/B.php’);

require_once(‘your/proj/inc/C.php’);

if(條件A) {

$a=newA();

$b=newB();

$c=newC();

// … 業務邏輯

}elseif(條件B) {

$a= newA();

$b=newB();

// … 業務邏輯

}

這樣就會有一個問題:如果腳本執行“條件B”這個分支時,C.php這個文件其實沒有必要包含。因為,任何一個被包含的文件,無論是否使用,均會被php引擎編譯。如果不使用,卻被編譯,這樣可以被視作一種資源浪費。更進一步,如果C.php包含了D.php,D.php包含了E.php。并且大部分情況都執行“條件B”分支,那么就會浪費一部分資源去編譯C.php,D.php,E.php三個“無用”的文件。

這時候,可以通過PHP的__autoload方法去除這種浪費,__autoload方法提供一種“lazy load”的機制,當第一次需要使用相關類時調用,這樣就不會加載不必要的類。還是通過上面的例子,修改如下:

/**

* 文件autoload_demo.php

*/

function__autoload($className) {

$filePath= “your/proj/inc/{$className}.php”;

if(is_readable($filePath)) {

require($filePath);

}

}

if(條件A) {

$a=newA();

$b=newB();

$c=newC();

// … 業務邏輯

}elseif(條件B) {

$a= newA();

$b=newB();

// … 業務邏輯

}

可以看到,文件開頭去掉了連串的require方法,使用了php的魔術方法__autoload替代。該函數的工作原理如下:

當php引擎第一次使用類A,但是找不到時,會自動調用__autoload方法,并將類名“A”作為參數傳入。所以,我們需要的做的就是根據類名,找到對應的文件,并包含進來,如果我們的方法也找不到,那么php引擎就會報錯。注意,這里可以只用require,因為一旦包含進來后,php引擎再遇到類A時,將不會調用__autoload,而是直接使用內存中的類A,不會導致多次包含。

所以,使用__autoload的關鍵在于,如何根據類名,找到對應類定義的文件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在PHP開發過程中,如果希望從外部引入一個class,通常會使用include和require方法,去把定義這...
    四月不見閱讀 1,083評論 0 0
  • Php:腳本語言,網站建設,服務器端運行 PHP定義:一種服務器端的HTML腳本/編程語言,是一種簡單的、面向對象...
    廖馬兒閱讀 2,197評論 2 38
  • 很多開發者寫面向對象的應用程序時對每個類的定義建立一個 PHP 源文件。一個很大的煩惱是不得不在每個腳本開頭寫一個...
    codefine閱讀 1,424評論 4 8
  • php是一種服務器端解釋的腳本語言。 什么是PHPPHP是一種服務器端腳本語言,他是專門為Web而設計的。 第一篇...
    vernwang閱讀 1,636評論 1 49
  • 文/沈鹿之 他差不多三十來歲的樣子,一張臉輪廓清晰,高挺的鼻梁,在我...
    沈鹿之閱讀 426評論 1 5