2012-05-25 77 views
0

有沒有一種方法可以在類中定義__autoload,所以每當我訪問一個未定義的類時,PHP將運行__autoload類方法?實現類__autoload

<?php 
class Test { 
    public function __construct() { 
     echo 'Instantiating ', __CLASS__, "\n"; 
    } 

    public function __autoload($className) { 
     echo "Loading $className\n"; 
     require_once($className . '.php'); 
    } 

    public function test() { 
     $test = new AnotherClass(); 
    } 
} 

$bill = new Test(); 
$bill->test(); 

AnotherClass.php:

<?php 
class AnotherClass { 
    public function __construct() { 
     echo 'Instantiating ', __CLASS__, "\n"; 
    } 
} 

輸出:

Instantiating Test 
Loading AnotherClass 
Instantiating AnotherClass 

回答

1

沒有,__autoload功能必須是全球性的。

然而,SPL有辦法註冊任何可調用作爲自動加載功能:spl_autoload_register()。儘管使用類方法沒什麼意義 - 您可能只是創建實例,註冊方法並且再也不使用該實例。

+0

要告訴PHP在哪裏可以找到'__autoload'將被定義的類? ;) – duskwuff

+0

好吧,這是一個全球性的功能。現在得到它 – Bruce

1

這頁有關於如何實現自動加載的類(PHP手冊)spl_autoload_register

+0

不錯的一個;沒有想到SPL。但是,在PHP 5.3 SPL是可選的,因此可能不可用 - 尤其是在共享主機上,您不一定有最新的PHP版本。 – ThiefMaster

+0

是的。但是您可以始終在引導代碼中內置備用備用選項。在我們的應用程序中,我們檢查我們是否可以使用spl_autoload_register函數,如果我們能做到,如果我們不能使用__autoload函數,但將它們都指向同一類。 – Ben

+0

@ThiefMaster在我所有的時間裏,我還沒有觀察到SPL被禁用的共享主機提供商:對於那個特定的擴展,你的論點的確非常弱。 – salathe

0

此作品信息!

class ClassAutoloader { 
    public function __construct() { 
     spl_autoload_register(array($this, 'loader')); 
    } 
    private function loader($className) { 
     echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n"; 
     include $className . '.php'; 
    } 
} 
+0

在PHP 5.3 SPL是可選的,因此可能不可用 - 特別是在共享主機上,您不一定有最新的PHP版本。除此之外,在創建類的多個實例時,代碼會變得非常討厭(註冊大量相等的自動加載函數)。 – ThiefMaster

+0

好吧,我明白了。也許我應該堅持require_once然後 – Bruce

+0

全局'__autoload'函數總是有效的。你只需要包含任何包含該功能的文件就可以工作。 – ThiefMaster