2012-09-16 42 views
8

php類自動加載器打開文件並檢查類名?我一直在看如何實際執行。有一件事我知道它的遞歸?如果我錯了,請讓我知道php自動加載器如何工作

如前所述overhere:autoloader brief over view 如何PHP自動裝彈機的工作原理

PHP的自動加載磁帶機遞歸搜索中定義的目錄爲 類,特質和接口定義。如果沒有任何進一步的配置,需要文件所在的目錄將被用作默認的類路徑,即 。

文件名不需要遵守任何約定。對於類定義,所有文件都被搜索到 。與類名稱相似的文件或 以.php或.inc結尾的文件是首選。如果支持,PHP Tokenizer將 用於可靠的類定義發現。

+1

看起來像你的問題中的鏈接已經足夠知道 –

+0

「php類Autoloader是否打開一個文件並檢查類名?」 - 它搜索文件中的所有類。 – zerkms

+0

但是從哪裏可以知道它是如何實現的,從頭開始自動加載器的整個過程,這對我來說很有趣,因爲它的第一個寫法是 – meWantToLearn

回答

14

的PHP自動加載機僅僅是一個機制,包括文件類構造

如果你把所有的類放在1個文件中,你不需要自動加載器。當然,當編程OO你給每一個類它自己的文件,和多數民衆贊成在自動裝卸進來

一些例子:

class AutoLoader 
{ 
    public function __construct() 
    { 
    spl_autoload_register(array($this, 'ClassLoader')); 
    } 

    public function ClassLoader($class) 
    {  
    if(class_exists($class, false)) 
     return true; 

    if(is_readable('path_to_my_classes/' . $class . '.php')) 
      include_once 'path_to_my_classes/' . $class . '.php' 
    } 
} 

$autoloader = new AutoLoader(); 

這裏會發生什麼事是創建自動加載類時,類方法Classloader被註冊爲自動加載器。

當創建一個新類時,Classloader方法首先檢查該類的文件是否已經加載。如果不是,則該課程將預先設置路徑並使用擴展名進行擴展。如果該文件可讀,則包含該文件。

當然,你可以使這非常複雜。我們來看一個名稱空間和映射器的例子。假設我們是在自動加載類:

private $mapper array('Foo' => 'path_to_foo_files/', 'Bar' => 'path_to_bar_files/'); 

    public function ClassLoader($class) 
    {  
    if(class_exists($class, false)) 
     return true; 

    // break into single namespace and class name 
    $classparts = explode('\\', $class); 
    $path = $this->mapper[$classparts[0]]; 

    if(is_readable($path . $classparts[1] . '.php')) 
      include_once $path . $classparts[1] . '.php' 
    } 

這裏,類名是一個命名空間部分和類名部分splittet。命名空間部分在映射器數組中查找,然後該路徑將用作php文件的包含路徑。

這些只是用來演示自動裝載機可以做什麼的示例。爲了生產,需要做更多的工作,例如錯誤檢查。