本篇文章是對php自動載入機制進行了詳細的分析介紹,需要的朋友參考下
一、php中實作自動載入的方法
1.使用require,include,require_once,include_once手動進行載入。
2.使用autoload來進行自動載入
3.使用spl的autoload來實現自動載入
手動載入的實作:
當需要載入的檔案很少的時候我們可以使用第一個來完成。這樣做很簡單也沒問題。
程式碼如下:
require_once 'a.php'; require_once 'b.php'; require_once 'c.php';
但是當需要載入檔案很多的時候這樣做還行嗎?需要寫十個,二十個require_once 或更多的時候我們該怎麼辦?
這時候我們可以使用autoload方法來簡化我們的程式碼。
autoload載入的實作:
我們在test目錄下建立一個in.php文件,內容如下。
程式碼如下:
echo '我是test下面的in.php<br />';
然後在test目錄下建立一個loader.php,內容如下。
程式碼如下:
// 需要重载autoload方法,自定义包含类文件的路径 function autoload($classname) { $class_file = strtolower($classname).".php"; if (file_exists($class_file)){ require_once($class_file); } } @$test = new in(); // 执行到这里会输出 <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">我是test下面的in.php</SPAN>
沒問題,成功了!我們還可以創建其他的文件來進行加載,但是當需要的文件很多需要區分目錄的時候怎麼辦?
這時我們需要修改loader.php可以使用映射來找到要載入的檔案。
程式碼如下:
function autoload($class_name) { $map = array( 'index' => './include/index.php', 'in' => './in.php' ); if (file_exists($map[$class_name]) && isset($map[$class_name])) { require_once $map[$class_name]; } } new index();
這種方法的好處就是類別名稱和檔案路徑只是用一個映射來維護,所以當檔案結構改變的時候,不需要修改類別名稱,只需要將映射中對應的項修改就好了。
但是autoload在一個專案中只能使用一次,當你的專案引用了別人的一個專案,你的專案中有一個autoload,別人的專案也有一個autoload,這樣兩個autoload就衝突了.解決的辦法就是修改autoload成為一個,這無疑是非常繁瑣的,應用場景單一。
spl的autoload載入實作:
spl的autoload系列函數使用一個autoload呼叫堆疊,你可以使用spl_autoload_register註冊多個自訂的autoload函數,應用場景廣泛
•在test目錄下建立in.php,內容如下
程式碼如下:
<?php class in { public function index() { echo '我是test下面的in.php'; } } ?>
在test目錄下建立loader.php,內容如下
#程式碼如下:
<?php set_include_path("/var/www/test/"); //这里需要将路径放入include spl_autoload("in"); //寻找/var/www/test/in.php $in = new in(); $in->index();
•spl_autoload_register將函數註冊到SPL autoload函數堆疊中,修改loader.php
程式碼如下:
function AutoLoad($class){ if($class == 'in'){ require_once("/var/www/test/in.php"); } } spl_autoload_register('AutoLoad'); $a = new in(); $a->index();
•spl_autoload_register註冊多個自訂的autoload函數的應用程式
首先在test目錄下建立mods資料夾並建立inmod.mod.php內容如下:
程式碼如下:
<?php class inmod { function construct() { echo '我是mods下的in'; } }
#然後在test目錄下建立libs資料夾並建立inlib.lib .php內容如下:
程式碼如下:
<?php class inlib { function construct() { echo '我是libs下的in'; } }
最後在test目錄下建立loader.php內容如下
程式碼如下:
<?php class Loader { /** * 自动加载类 * @param $class 类名 */ public static function mods($class) { if($class){ set_include_path( "/var/www/test/mods/" ); spl_autoload_extensions( ".mod.php" ); spl_autoload( strtolower($class) ); } } public static function libs($class) { if($class){ set_include_path( "/var/www/test/libs/" ); spl_autoload_extensions( ".lib.php" ); spl_autoload( strtolower($class) ); } } } spl_autoload_register(array('Loader', 'mods')); spl_autoload_register(array('Loader', 'libs')); new inmod();//输出<SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14px">我是mods下的in</SPAN> new inlib();//<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">输出</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14px">我是libs下的in</SPAN>
以上是深入學習php自動載入機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!