php的autoload自動載入機制用法執行個體詳解

來源:互聯網
上載者:User
自PHP5後,引入了autoload這個攔截器方法,可以自動對class檔案進行包含引用,下面看具體的使用方法。

在PHP開發過程中,如果希望從外部引入一個class,通常會使用include和require方法,去把定義這個class的檔案包含進來,但是這樣可能會使得在引用檔案的新指令碼中,存在大量的include或require方法調用,如果一時疏忽遺漏則會產生錯誤,使得代碼難以維護。

自PHP5後,引入了autoload這個攔截器方法,可以自動對class檔案進行包含引用,通常我們會這麼寫:

function autoload($className) { include_once $className . '.class.php'; } $user = new User();

當PHP引擎試圖執行個體化一個未知類的操作時,會調用autoload()方法,在PHP出錯失敗前有了最後一個機會載入所需的類。因此,上面的這段代碼執行時,PHP引擎實際上替我們自動執行了一次autoload方法,將User.class.php這個檔案包含進來。

在autoload函數中拋出的異常不能被catch語句塊捕獲並導致致命錯誤。

如果使用 PHP的CLI互動模式時,自動載入機制將不會執行。

當你希望使用PEAR風格的命名規則,例如需要引入User/Register.php檔案,也可以這麼實現:

//載入我 function autoload($className) { $file = str_replace('_', DIRECTORY_SEPARATOR, $className); include_once $file . 'php'; } $userRegister = new User_Register();

這種方法雖然方便,但是在一個大型應用中如果引入多個類庫的時候,可能會因為不同類庫的autoload機制而產生一些莫名其妙的問題。在PHP5引入SPL標準庫後,我們又多了一種新的解決方案,spl_autoload_register()函數。

此函數的功能就是把函數註冊至SPL的autoload函數棧中,並移除系統預設的autoload()函數。一旦調用spl_autoload_register()函數,當調用未定義類時,系統會按順序調用註冊到spl_autoload_register()函數的所有函數,而不是自動調用autoload()函數,下例調用的是User/Register.php而不是User_Register.class.php:

複製代碼 代碼如下:

//不載入我 function autoload($className) { include_once $className . '.class.php'; } //載入我 function autoload($className) { $file = str_replace('/', DIRECTORY_SEPARATOR, $className); include_once $file . '.php'; } //開始載入 spl_autoload_register('autoload'); $userRegister = new User_Register();

在使用spl_autoload_register()的時候,我們還可以考慮採用一種更安全的初始化調用方法,參考如下:

代碼如下:

//系統預設autoload函數 function autoload($className) { include_once $className . '.class.php'; } //可供SPL載入的autoload函數 function autoload($className) { $file = str_replace('_', DIRECTORY_SEPARATOR, $className); include_once $file . '.php'; } //不小心載入錯了函數名,同時又把預設autoload機制給取消了……囧 spl_autoload_register('_autoload', false); //容錯機制 if(false === spl_autoload_functions()) { if(function_exists('autoload')) { spl_autoload_register('autoload', false); } }

在Unix/Linux環境下,如果你有多個規模較小的類,為了管理方便,都寫在一個php檔案中的時候,可以通過以ln -s命令做軟連結的方式快速分發成多個不同類名的拷貝,再通過autoload機制進行載入。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.