當前位置:才華齋>設計>網頁設計>

php自動載入--autoload()函式用法

網頁設計 閱讀(2.21W)

autoload在php主版本中是自動載入檔案的一個方法了我們可以定義許多的檔案在目錄然後通過autoload載入了,下面一起來看看autoload函式用法。

php自動載入--autoload()函式用法

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

通過閱讀了 Autoloading in PHP 這篇文章,我理解的 Autoload 的載入機制,當通過 new 來例項化一個類時,PHP會通過定義的__autoload 函式載入相應的檔案,如果這個類檔案使用了 extends 或者 implements 需要用到其他的類檔案,php會重新執行 autoload 去進行類檔案的查詢和載入,如果發生了兩次對同一類檔案的請求,就會報錯

自動載入原理

在使用PHP的OO模式開發系統時,通常大家習慣上將每個類的實現都存放在一個單獨的檔案裡,這樣會很容易實現對類進行復用,同時將來維護時也很便利。這也是OO設計的基本思想之一。在PHP5之前,如果需要使用一個類,只需要直接使用include/require將其包含進來即可。下面是一個實際的例子:

/* */

<?php

class Person {

var $name, $age;

function __construct ($name, $age)

{

$this->name = $name;

$this->age = $age;

}

}

?>

/* no_ */

<?php

require_once (””);

$person = new Person(”Altair”, 6);

var_dump ($person);

?>

在這個例子中,檔案需要使用Person類,它使用了require_once將其包含,然後就可以直接使用Person類來例項化一個物件。

但隨著專案規模的不斷擴大,使用這種方式會帶來一些隱含的問題:如果一個PHP檔案需要使用很多其它類,那麼就需要很多的require/include語句,這樣有可能會造成遺漏或者包含進不必要的類檔案。如果大量的檔案都需要使用其它的類,那麼要保證每個檔案都包含正確的類檔案肯定是一個噩夢。

PHP5為這個問題提供了一個解決方案,這就是類的自動裝載(autoload)機制。autoload機制可以使得PHP程式有可能在使用類時才自動包含類檔案,而不是一開始就將所有的類檔案include進來,這種機制也稱為lazy loading。

下面是使用autoload機制載入Person類的例子:

/* */

<?php

function __autoload($classname) {

require_once ($classname . “”);

}

$person = new Person(”Altair”, 6);

var_dump ($person);

?>

通常PHP5在使用一個類時,如果發現這個類沒有載入,就會自動執行__autoload()函式,在這個函式中我們可以載入需要使用的類。在我們這個簡單的例子中,我們直接將類名加上副檔名””構成了類檔名,然後使用require_once將其載入。從這個例子中,我們可以看出autoload至少要做三件事情,第一件事是根據類名確定類檔名,第二件事是確定類檔案所在的磁碟路徑(在我們的例子是最簡單的情況,類與呼叫它們的PHP程式檔案在同一個資料夾下),第三件事是將類從磁碟檔案中載入到系統中。第三步最簡單,只需要使用include/require即可。要實現第一步,第二步的功能,必須在開發時約定類名與磁碟檔案的對映方法,只有這樣我們才能根據類名找到它對應的磁碟檔案。

因此,當有大量的類檔案要包含的時候,我們只要確定相應的規則,然後在__autoload()函式中,將類名與實際的磁碟檔案對應起來,就可以實現lazy loading的效果。從這裡我們也可以看出__autoload()函式的實現中最重要的是類名與實際的磁碟檔案對映規則的實現。

但現在問題來了,如果在一個系統的實現中,如果需要使用很多其它的類庫,這些類庫可能是由不同的開發人員編寫的,其類名與實際的磁碟檔案的對映規則不盡相同。這時如果要實現類庫檔案的自動載入,就必須在__autoload()函式中將所有的對映規則全部實現,這樣的話__autoload()函式有可能會非常複雜,甚至無法實現。最後可能會導致__autoload()函式十分臃腫,這時即便能夠實現,也會給將來的維護和系統效率帶來很大的負面影響。在這種情況下,難道就沒有更簡單清晰的解決辦法了吧?答案當然是:NO! 在看進一步的`解決方法之前,我們先來看一下PHP中的autoload機制是如何實現的。

(2) PHP的autoload機制的實現

實現自動載入,我們需要藉助一個函式來實現:

/*

autoload_function

欲註冊的自動裝載函式。如果沒有提供任何引數,則自動註冊 autoload 的預設實現函式spl_autoload()。

throw

此引數設定了 autoload_function 無法成功註冊時, spl_autoload_register()是否丟擲異常。

prepend

如果是 true,spl_autoload_register() 會新增函式到佇列之首,而不是佇列尾部。

*/

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

最常用的一種方式就是通過spl_autoload_register函式來註冊自動載入類的方法!

通過spl_autoload_register註冊

我們可以通過spl_autoload_register函式註冊類的方法,在類呼叫前,我們判斷類檔案路徑是否是檔案,如果是則引入之!

下面是一個小例子:

<?php

class autoload

{

publicstatic functionload($className)

{

$name = str_replace('', '/', $className);

$fileName = sprintf('%', $name);

if (is_file($fileName)) {

require_once $fileName;

}

// var_dump($fileName);

}

}

// 這樣寫也可以的

// spl_autoload_register(array("autoload", "load"));

spl_autoload_register("autoload::load");

通過__autoload函式實現

我們新建一個檔案,裡面只放如下程式碼也可以實現上面一樣的功能:

<?php

function__autoload($className) {

$name = str_replace('', '/', $className);

$fileName = sprintf('%', $name);

if (is_file($fileName)) {

require_once($fileName);

}

}

小結:自動載入可以使得我們的操作更簡便,經常需要自動載入一些預設配置,因此掌握自動載入的實現是非常重要的!