首頁  >  文章  >  後端開發  >  關於PHP的autoLoad自動載入機制的分析

關於PHP的autoLoad自動載入機制的分析

不言
不言原創
2018-06-13 10:23:421359瀏覽

這篇文章主要介紹了關於PHP的autoLoad自動載入機制的分析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

php的autoload大致可以使用兩種方法:__autoload和spl方法。這兩種方法又各有不同的幾種使用方法

__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的幾個函數:
關於PHP的autoLoad自動載入機制的分析

#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 == &#39;http&#39;){ 
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 == &#39;http&#39;){ 
require_once("/home/yejianfeng/handcode/http.php"); 
} 
if($class == &#39;http2&#39;){ 
require_once("/home/yejianfeng/handcode/http2.php"); 
} 
}); 
spl_auto_call(&#39;http2&#39;); 
$a = new http(); 
$a->callname(); //这个时候会输出"this is http2"

spl_auto_register這個函數使得我們不使用__autoload,#
spl_autoload_register(array(__CLASS__, &#39;autoload&#39;)); 

public static function autoload($class) 
{ 
….. 

}

spl_auto_register這個函數使得我們不使用__autoload,使用自訂的函數來進行自動載入成為可能。這個方法現在是常用來的。
Zend的AutoLoader模組就使用了這個方法。摘錄其中對應的程式碼 

rrreee

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

如何解決PHP基於DateTime類別Unix時間戳與日期互轉的問題

##在php中用html_entity_decode實作HTML實體轉義

#

以上是關於PHP的autoLoad自動載入機制的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn