一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 說說PHP的autoLoad自動加載機制

說說PHP的autoLoad自動加載機制

2020-01-12 17:57PHP教程網 PHP教程

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 == '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) 

….. 

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产精品综合欧美 | 日本无翼乌漫画 | 91porny.首页| 91国语自产拍在线观看 | 深夜啪啪网站 | 麻豆视频免费在线观看 | 久久黄色免费 | 麻豆网站视频国产在线观看 | 婷婷综合久久 | 欧美成人tv| 日本网络视频www色高清免费 | 欧美一级裸片 | 99这里只有精品在线 | 天天干天天日天天射天天操毛片 | 男人操女人免费视频 | 亚洲国产精品久久久久久网站 | 全程粗语对白视频videos | 日韩欧美精品一区二区 | 9丨精品国产高清自在线看 9久热这里只有精品免费 | 91久久夜色精品国产九色 | 日本高清视频网站www | 男人天堂网页 | 无颜之月全集免费观看 | 98pao强力打造高清免费 | 韩国三级大全 | 猛操美女 | 日本www午夜色在线视频 | 九二淫黄大片看片 | 成人小视频在线观看 | 风间由美被义子中文字幕 | 九九免费高清在线观看视频 | 国产videos hd| 性xxxxⅹhd成人| 国产精品综合在线 | 国产精品自在欧美一区 | 婷婷九月 | 国色天香社区视频免费高清在线观看 | 成人看的羞羞视频免费观看 | 日韩视频一区二区 | 国产v日韩v欧美v精品专区 | 免费欧美视频 |