PHP AutoLoad 自動載入機制分析實踐
PHP autoload自動載入機制可以減少不必要的檔案包含,從而一定程度上提高PHP網站的執行效能。本文就簡單介紹一下PHP中autoload自動載入機制的原理及使用方法。
__autoload的使用方法1
最經常使用的就是這種方法,根據類名,找出類檔案,然後require_one
function __autoload($class_name) { $path = str_replace('_', '/', $class_name); require_once $path . '.php'; } // 這裡會自動載入Http/File/Interface.php 檔案 $a = new Http_File_Interface();
這種方法的好處就是簡單易使用。當然也有缺點,缺點就是將類名和檔案路徑強制做了約定,當修改檔案結構的時候,就勢必要修改類名。
__autoload的使用方法2(直接對映法)
$map = array( 'Http_File_Interface' => 'C:/PHP/HTTP/FILE/Interface.php' ); function __autoload($class_name) { if (isset($map[$class_name])) { require_once $map[$class_name]; } } // 這裡會自動載入C:/PHP/HTTP/FILE/Interface.php 檔案 $a = new Http_File_Interface();
這種方法的好處就是類名和檔案路徑只是用一個對映來維護,所以當檔案結構改變的時候,不需要修改類名,只需要將對映中對應的項修改就好了。
這種方法相較於前面的方法缺點是當檔案多了的時候這個對映維護起來非常麻煩,或許這時候你就會考慮使用json或者單獨一個檔案來進行維護了。或許你會想到使用一個框架來維護或者建立這麼一個對映。
spl_autoload
__autoload的最大缺陷是無法有多個autoload方法
好了, 想下下面的這個情景,你的專案引用了別人的一個專案,你的專案中有一個__autoload,別人的專案也有一個__autoload,這樣兩個__autoload就衝突了。解決的辦法就是修改__autoload成為一個,這無疑是非常繁瑣的。
因此我們急需使用一個autoload呼叫堆疊,這樣spl的autoload系列函式就出現了。你可以使用spl_autoload_register註冊多個自定義的autoload函式
如果你的PHP版本大於5.1的話,你就可以使用spl_autoload
先了解spl的幾個函式:
spl_autoload 是_autoload()的預設實現,它會去include_path中尋找$class_name(.php/.inc)
Spl_autoload實現自動載入:
/*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*test.php*/ <?php set_include_path("/home/yejianfeng/handcode/"); //這裡需要將路徑放入include spl_autoload("http"); //尋找/home/yejianfeng/handcode/http.php $a = new http(); $a->callname();
Spl_autoload_register
將函式註冊到SPL __autoload函式棧中,直接看一個例子:
/*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*test.php*/ <?php spl_autoload_register(function($class){ if($class == 'http'){ require_once("/home/yejianfeng/handcode/http.php"); } }); $a = new http(); $a->callname();
spl_autoload_call
呼叫spl_autoload_register中註冊的呼叫函式, 看下面的例子
/*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*http2.php*/ <?php class http { public function callname(){ echo "this is http2"; } } /*test.php*/ <?php spl_autoload_register(function($class){ if($class == 'http'){ require_once("/home/yejianfeng/handcode/http.php"); } if($class == 'http2'){ require_once("/home/yejianfeng/handcode/http2.php"); } }); spl_auto_call('http2'); $a = new http(); $a->callname(); //這個時候會輸出"this is http2"
spl_auto_register這個函式使得我們不使用__autoload,使用自定義的函式來進行自動載入成為可能。這個方法現在是經常使用到的。
Zend的AutoLoader模組就使用了這個方法。摘錄其中對應的程式碼
spl_autoload_register(array(__CLASS__, 'autoload')); public static function autoload($class) { ….. }
相關文章
- PHP自動載入__autoload的工作機制PHP
- PHP自動載入機制PHP
- PHP 類自動載入機制PHP
- PHP autoload 機制詳解PHP
- PHP autoload機制詳解PHP
- php 自動類載入類 composer.json 實現自動載入PHPJSON
- php基礎,php自動載入的實現程式碼示例PHP
- 初學 PHP 類的自動載入PHP
- PHP 自動載入功能原理解析PHP
- ThinkPHP5.1.x 框架原始碼分析 (二) [框架的靈魂] - 自動載入 spl_autoload_register 初識PHP框架原始碼
- Java實現配置載入機制Java
- App資料分析小心預載入機制APP
- Python實踐:模組自動過載Python
- TP5.1 原始碼窺探之類的自動載入機制原始碼
- 類載入機制
- PHP 物件導向 (八)類的自動載入PHP物件
- PHP檔案的自動載入(autoloading)PHP
- 自動載入
- 【Java面試題】之類載入:從面試題分析Java類載入機制Java面試題
- 類的載入機制
- JVM:類載入機制JVM
- java類載入機制Java
- JVM類載入機制JVM
- ABP - 模組載入機制
- JVM 類載入機制JVM
- __autoload()嘗試載入未定義的類
- PHP 的自動載入(持續學習更新中)PHP
- PHP名稱空間與自動載入簡述PHP
- PHP名稱空間及自動載入淺析PHP
- Java 類載入器以及載入機制Java
- spl_autoload_register 註冊自動載入涉及的佇列資料結構你懂嗎佇列資料結構
- 虛擬機器類載入機制:類載入時機虛擬機
- PHP框架中的檔案載入的實現(自動載入/PSR規範/名稱空間)PHP框架
- 三次打破雙親載入機制原始碼分析原始碼
- kubernetes實踐之五十:kubelet執行機制分析
- 類載入機制總結
- 類載入機制與反射反射
- JVM-類載入機制JVM