首頁  >  文章  >  後端開發  >  php autoload的用法總結

php autoload的用法總結

怪我咯
怪我咯原創
2017-07-06 10:47:091277瀏覽

在PHP中使用類別時,我們必須在使用前載入進來,不管是透過require 的方式還是include 的方式,但是會有兩個問題影響我們做出載入的決定

PHP中提供了Autoload來幫助我們方便的進行文件的包含,但是autoload並非想像的那樣能夠處理所有的情況,今天就來記錄一下前幾天遇到的autoload存在的一些問題。

為什麼要使用Autoload

在PHP中使用類別時,我們必須在使用前載入進來,不管是透過require 的方式還是include 的方式,但會有兩個問題影響我們做出載入的決定。

首先是不知道這個類別檔案存放在什麼地方,另外一個就是不知道什麼時候需要用到這個檔案。特別是專案檔案特別多時,不可能每個檔案都在開始的部分寫很長一串的 require ….

在PHP5之後,我們可以透過 autoload來解決這個問題。 而且在PHP5.1之後,也提供了 spl_autoload_register() 來提供更完善的載入機制。

透過閱讀了Autoloading in PHP 這篇文章,我理解的Autoload 的載入機制,當透過new 來實例化一個類別時,PHP會透過定義的autoload 函數載入對應的文件,如果這個類別文件使用了extends 或implements 需要用到其他的類別文件,php會重新運行autoload 去進行類別文件的查找和加載,如果發生了兩次對同一類文件的請求,就會報錯。原文作者提供了三個很有趣的例子來說明這個問題,可以透過 這裡 下載原始碼查看。

一般情況下,有很多種方法來解決載入時到對應位置尋找檔案的方法。用的最多的就是指定特定的命名標準。

Zend的方法

zend推薦了一個最受歡迎的辦法,在檔案名稱中包含路徑。例如下面的範例:

// Main.class

function autoload($class_name) {
    $path = str_replace('_', DIRECTORY_SEPARATOR, $ class_name);
    require_once $path.'.php';
}

$temp = new Main_Super_Class(); 所有的底線都會被替換成路徑中的分隔符,上例就會去Main/Super/Class.php檔案

這種方法的缺點是在編碼過程中,我們必須明確的知道程式碼檔案應當所處的位置,而且由於

將檔案路徑硬編碼在了類別名稱中,如果需要修改資料夾的結構時,我們必須手動修改所有的類別名稱。

'Include All'方法

如果是在一個開發環境中,並且對於速度不是很在意的話,使用這個方法是非常方便的。透過將所有類別文件放在一個或幾個特定資料夾中,然後透過遍歷的方式來尋找載入。

例如:

 程式碼如下:

<?php 
  $arr = array ( 
    &#39;Project/Classes&#39;, 
    &#39;Project/Classes/Children&#39;, 
    &#39;Project/Interfaces&#39; 
  );
  foreach($arr as $dir) { 
    $dir_list = opendir($dir);
    while ($file = readdir($dir_list)) { 
      $path = $dir.DIRECTORY_SEPARATOR.$file; 
      if(in_array($file, array(&#39;.&#39;, &#39;..&#39;)) || is_dir($path)) 
        continue;
      if (strpos($file, ".class.php")) 
        require_once $path; 
    } 
  } 
?>

#關聯檔與位置

另外一個方法是在類別檔案和他的位置之間建立關聯的設定檔,例如:

程式碼如下:

// configuration.php 
array_of_associations = array( 
  &#39;MainSuperClass&#39; = &#39;C:/Main/Super/Class.php&#39;, 
  &#39;MainPoorClass&#39; = &#39;C:/blablabla/gy.php&#39; 
);

呼叫的檔案

 程式碼如下:

<?php 
  require &#39;autoload_generated.php&#39;;
  function autoload($className) { 
    global $autoload_list; 
    require_once $autoload_list[$className]; 
  }
  $x = new A(); 
?>

當然,如果檔案特別多的時候,維護起來會是一件麻煩事,但是與在類別名稱中硬編碼位置,哪個更好呢?

我們當然不希望手動來維護這個列表,那麼可以使用自動產生這個檔案來實現,這個對應關係的檔案可以是php\xml\json等等。原文的作者實作了一個這樣的工具,仔細考慮一下的話,這個不是很難實現,原文作者甚至發展了一個小型的 Autoload 框架,值得學習。

以上是php autoload的用法總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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