麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 語言 > PHP > 正文

php中autoload的用法總結

2024-09-04 11:46:50
字體:
來源:轉載
供稿:網友

在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推薦了一種最流行的辦法,在文件名中包含路徑。例如下面的例子:

  1. // Main.class  
  2.  
  3. function __autoload($class_name) {  
  4.     $path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);  
  5.     require_once $path.'.php';  

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

這種方法的缺點是在編碼過程中,我們必須明確的知道代碼文件應當所處的位置,而且由于將文件路徑硬編碼在了類名中,如果需要修改文件夾的結構時,我們必須手工修改所有的類名。

'Include All'方法

如果是在一個開發環境中,并且對于速度不是很在意的話,使用這個方法是非常方便的。通過將所有類文件放在一個或幾個特定文件夾中,然后通過遍歷的方式查找加載。

例如:

  1. <?php  
  2.   $arr = array (  
  3.     'Project/Classes',  
  4.     'Project/Classes/Children',  
  5.     'Project/Interfaces'  
  6.   );  
  7.  
  8.   foreach($arr as $dir) {  
  9.     $dir_list = opendir($dir);  
  10.  
  11.     while ($file = readdir($dir_list)) {  
  12.       $path = $dir.DIRECTORY_SEPARATOR.$file;  
  13.       if(in_array($filearray('.''..')) || is_dir($path))  
  14.         continue;  
  15.  
  16.       if (strpos($file".class.php"))  
  17.         require_once $path;  
  18.     }  
  19.   }  
  20. ?> 

關聯文件和位置

另外一個方法是在類文件和他的位置之間建立關聯的配置文件,例如:

  1. // configuration.php  
  2. array_of_associations = array(  
  3.   'MainSuperClass' = 'C:/Main/Super/Class.php',  
  4.   'MainPoorClass' = 'C:/blablabla/gy.php'  
  5. ); 

調用的文件

  1. <?php  
  2.   require 'autoload_generated.php';  
  3.  
  4.   function __autoload($className) {  
  5.     global $autoload_list;  
  6.     require_once $autoload_list[$className];  
  7.   }  
  8.  
  9.   $x = new A();  
  10. ?> 

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产韩国精品一区二区三区久久 | 4480午夜 | 久草视频手机在线观看 | 春光影院理论片 | 一级α片免费看刺激高潮视频 | 狠狠干91 | 国产xxxxx在线观看 | 99热草| 狠狠干伊人网 | 欧美黄色大片免费观看 | 日本成人一区二区三区 | 亚洲91网 | 国产理论视频在线观看 | 成人一级黄色片 | 久久国产午夜 | 久久亚洲春色中文字幕久久 | 久草最新在线 | 日韩精品免费一区二区三区 | 91情侣偷在线精品国产 | xxxx69hd一hd72| 日本免费不卡一区二区 | 久久精品国产精品亚洲 | 毛片在线免费观看网址 | 欧美黑人伦理 | 国产免费看片 | 久久草在线视频国产 | 国产午夜电影 | 黄色一级毛片免费看 | 全黄毛片 | 国产免费久久久久 | 黄 色 免费网 站 成 人 | 成av在线 | 激情亚洲一区二区三区 | 成人在线视频在线观看 | 成人三级电影网站 | 蜜桃视频网站www | 黄色网欧美 | 久久久tv | 国产精品视频yy9299一区 | 国产精品hd免费观看 | 91精品国产刺激国语对白 |