php中autoload的用法總結(jié)
PHP中提供了Autoload來幫助我們方便的進行文件的包含,但是autoload并非想象的那樣能夠處理所有的情況,今天就來記錄一下前幾天遇到的autoload存在的一些問題。
為什么要使用 Autoload
在PHP中使用類時,我們必須在使用前加載進來,不管是通過 require 的方式還是 include 的方式,但是會有兩個問題影響我們做出加載的決定。
首先是不知道這個類文件存放在什么地方,另外一個就是不知道什么時候需要用到這個文件。特別是項目文件特別多時,不可能每個文件都在開始的部分寫很長一串的 require ….
在PHP5之后,我們可以通過 __autoload來解決這個問題。 而且在PHP5.1之后,還提供了 spl_autoload_register() 來提供更完善的加載機制。
通過閱讀了 Autoloading in PHP 這篇文章,我理解的 Autoload 的加載機制,當通過 new 來實例化一個類時,PHP會通過定義的__autoload 函數(shù)加載相應(yīng)的文件,如果這個類文件使用了 extends 或者 implements 需要用到其他的類文件,php會重新運行 autoload 去進行類文件的查找和加載,如果發(fā)生了兩次對同一類文件的請求,就會報錯。原文作者提供了三個很有趣的例子來說明這個問題,可以通過 這里 下載源碼查看。
一般情況下,有很多種方法來解決加載時到相應(yīng)位置查找文件的方法。用的最多的就是指定特定的命名標準。
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文件
這種方法的缺點是在編碼過程中,我們必須明確的知道代碼文件應(yīng)當所處的位置,而且由于
將文件路徑硬編碼在了類名中,如果需要修改文件夾的結(jié)構(gòu)時,我們必須手工修改所有的類名。
'Include All'方法
如果是在一個開發(fā)環(huán)境中,并且對于速度不是很在意的話,使用這個方法是非常方便的。通過將所有類文件放在一個或幾個特定文件夾中,然后通過遍歷的方式查找加載。
例如:
<?php
$arr = array (
'Project/Classes',
'Project/Classes/Children',
'Project/Interfaces'
);
foreach($arr as $dir) {
$dir_list = opendir($dir);
while ($file = readdir($dir_list)) {
$path = $dir.DIRECTORY_SEPARATOR.$file;
if(in_array($file, array('.', '..')) || is_dir($path))
continue;
if (strpos($file, ".class.php"))
require_once $path;
}
}
?>
關(guān)聯(lián)文件和位置
另外一個方法是在類文件和他的位置之間建立關(guān)聯(lián)的配置文件,例如:
// configuration.php
array_of_associations = array(
'MainSuperClass' = 'C:/Main/Super/Class.php',
'MainPoorClass' = 'C:/blablabla/gy.php'
);
調(diào)用的文件
<?php
require 'autoload_generated.php';
function __autoload($className) {
global $autoload_list;
require_once $autoload_list[$className];
}
$x = new A();
?>
當然,如果文件特別多的時候,維護起來會是一件麻煩事,但是與在類名中硬編碼位置,哪個更好呢?
我們當然不希望手工來維護這個列表,那么可以使用自動生成這個文件來實現(xiàn),這個對應(yīng)關(guān)系的文件可以是php\xml\json等等。原文的作者實現(xiàn)了一個這樣的工具,仔細考慮一下的話,這個不是很難實現(xiàn),原文作者甚至發(fā)展了一個小型的 Autoload 框架,值得學習。
相關(guān)文章
PHP實現(xiàn)Unicode編碼相互轉(zhuǎn)換的方法示例
這篇文章主要介紹了PHP實現(xiàn)Unicode編碼相互轉(zhuǎn)換的方法,結(jié)合實例形式分析了Unicode編碼與解碼的相關(guān)實現(xiàn)與使用技巧,需要的朋友可以參考下2017-04-04php 實現(xiàn)賬號不能同時登陸的方法分析【當其它地方登陸時,當前賬號失效】
這篇文章主要介紹了php 實現(xiàn)賬號不能同時登陸的方法,結(jié)合實例形式分析了PHP基于session實現(xiàn)當其它地方登陸時,當前賬號失效的相關(guān)操作技巧,需要的朋友可以參考下2020-03-03PHP開發(fā)環(huán)境配置(MySQL數(shù)據(jù)庫安裝圖文教程)
下載完軟件后開始PHP開發(fā)環(huán)境的配置。注意是開發(fā)環(huán)境,不是服務(wù)器環(huán)境。2010-04-04PHP實現(xiàn)將優(yōu)酷土豆騰訊視頻html地址轉(zhuǎn)換成flash swf地址的方法
這篇文章主要介紹了PHP實現(xiàn)將優(yōu)酷土豆騰訊視頻html地址轉(zhuǎn)換成flash swf地址的方法,涉及php根據(jù)各個網(wǎng)站的網(wǎng)址規(guī)則針對URL地址的正則匹配與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-08-08PHP實現(xiàn)雙鏈表刪除與插入節(jié)點的方法示例
這篇文章主要介紹了PHP實現(xiàn)雙鏈表刪除與插入節(jié)點的方法,結(jié)合實例形式分析了PHP雙鏈表的定義與節(jié)點操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-11-11php查詢mysql數(shù)據(jù)庫并將結(jié)果保存到數(shù)組的方法
這篇文章主要介紹了php查詢mysql數(shù)據(jù)庫并將結(jié)果保存到數(shù)組的方法,實例分析了php使用mysql_fetch_assoc查詢數(shù)據(jù)庫的技巧,需要的朋友可以參考下2015-03-03