2009-12-14 55 views
6

我真的不得到的文檔從我的理解spl_autoloadPHP spl_autoload

bool spl_autoload_register ([ callback $autoload_function ]) 

,它會嘗試運行註冊的功能,當PHP遇到尚未加載的類。例如,

public function autoload() { 
    require ('nonLoadedClass.php'); 
} 
spl_autoload_register(autoload); 
$x = new nonLoadedClass(); 

會導致require運行嗎?所以我也可以註冊許多自動加載功能?

public function autoloadXXX() {...} 
public function autoloadYYY() {...} 
public function autoloadZZZ() {...} 
spl_autoload_register('autoloadXXX'); 
spl_autoload_register('autoloadYYY'); 
spl_autoload_register('autoloadZZZ'); 
在教義的情況下

require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php'); 
spl_autoload_register(array('Doctrine', 'autoload')); 

陣列被傳遞,所以我想它會嘗試運行學說類(這是必需的)內的自動加載功能?

回答

16

spl_autoloader_register註冊一個回調函數/方法,當您的代碼嘗試使用未知類時將會調用該方法。

callback功能可以以多種方式來描述:

  • 一個簡單的函數名:'my_function'
  • 一個類的一個靜態方法:array('MyClass', 'myMethod')
  • 一個類的實例的方法,包括:array($myObject, 'myMethod')

在教條的情況下,它似乎是第二個解決方案:如果使用PHP不知道的類,aut oloader將調用Doctrine::autoload,將類名稱作爲參數傳遞給它。


,這樣我也可以註冊多個自動加載 功能?

是的,你可以與spl_autoload_register

如果必須有多個自動加載的 功能,spl_autoload_register() 允許這一點。它實際上 創建一個自動載入函數的隊列, 並以它們定義的 的順序遍歷它們中的每一個。

但我們通常不會爲每個類定義一個自動加載函數/方法;我想這將是相當低效的。

相反,我們使用由自動加載函數接收的類名來決定應該包含哪個文件。

例如,自動加載功能可能是這樣的:

function my_autoloader($className) 
{ 
    require LIBRARY_PATH . '/' . $className . '.php'; 
} 

訣竅是,如果你的文件,它們所包含的類的名字命名,它立刻變得容易多了;-)

這爲什麼課程通常使用PEAR約定命名:My_Class_Name映射到文件My/Class/Name.php

0

什麼說法是正確的。當未知的類被實例化時調用它。然後你有機會包括/需要必要的文件。

當函數駐留在類中時,必須傳入一個數組。在這種情況下,它是一個靜態函數,因爲它們傳遞的是Doctrine類而不是Doctrine類的實例。

1

您的整個陳述是正確的。

spl_autoload_register允許您註冊多個自動加載功能。在您嘗試創建或使用尚未加載到PHP環境中的類的對象的情況下,PHP將運行您尋找該類的所有自動加載功能。

您給出的學說示例是使用所謂的callback在類中註冊方法。回調只是一個包含類名稱(用於靜態方法)或該類的實例(用於非靜態方法)和方法名稱的數組。

相關問題