首頁  >  文章  >  後端開發  >  深入學習php自動載入機制

深入學習php自動載入機制

伊谢尔伦
伊谢尔伦原創
2017-07-01 09:59:411990瀏覽

本篇文章是對php自動載入機制進行了詳細的分析介紹,需要的朋友參考下

一、php中實作自動載入的方法
1.使用require,include,require_onceinclude_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 &#39;我是test下面的in.php<br />&#39;;

然後在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(
  &#39;index&#39; => &#39;./include/index.php&#39;,
  &#39;in&#39; => &#39;./in.php&#39;
 );
    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 &#39;我是test下面的in.php&#39;;
 }
}
?>


在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 == &#39;in&#39;){
        require_once("/var/www/test/in.php");
    }
}
spl_autoload_register(&#39;AutoLoad&#39;);
$a = new in();
$a->index();


•spl_autoload_register註冊多個自訂的autoload函數的應用程式
首先在test目錄下建立mods資料夾並建立inmod.mod.php內容如下:

程式碼如下:

<?php
class inmod
{
 function construct()
 {
  echo &#39;我是mods下的in&#39;;
 }
}


#然後在test目錄下建立libs資料夾並建立inlib.lib .php內容如下:

程式碼如下:

<?php
class inlib
{
 function construct()
 {
  echo &#39;我是libs下的in&#39;;
 }
}


最後在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(&#39;Loader&#39;, &#39;mods&#39;));
spl_autoload_register(array(&#39;Loader&#39;, &#39;libs&#39;));
new inmod();//输出<SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是mods下的in</SPAN>
new inlib();//<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">输出</SPAN><SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是libs下的in</SPAN>

以上是深入學習php自動載入機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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