2012-12-28 26 views
1

簡單的問題,但我不知道這是不是真的有可能..可能從對象使用spl_autoload_register?

例子:

類測試有這樣的spl_autoload_register:

function __construct() { 
spl_autoload_register(function ($class) { 
     echo "{$this->projectroot}/include/{$class}.php"; 
     require_once(strtolower("{$this->projectroot}/classes/{$class}.php")); 
}); 
} 

$ projectroot是與對象範圍變量項目目錄的路徑。

我包括類測試在我的項目,創建一個新的實例出來的:

$test = new test(); 

現在我想$測試以加載與函數的類文件,當我創建:

$test2 = new test2(); 

其中test2是/include/test2.php中稱爲test2的類。

當我試圖做到這一點,它給了我一個錯誤說:

Fatal error: Using $this when not in object context in 

但是當我嘗試:

$test2 = new $test1->test2(); 

它忽略了測試1的spl_autoload_register功能完全:/只是指出顯然test2不是已知的方法(未定義的屬性)。

有沒有辦法在我的項目中的類測試中使用spl_autoload_register函數,而無需在我的主項目中進一步定義它?

編輯

我「固定」它使用全局變量,但我很好奇,如果有一些面向對象的方法? (不是說這是實用/最佳實踐OOP使用...)只是好奇。

+0

如果您在__constructor中加載文件,則不需要spl_autoload;只需要文件,就是這樣... –

+0

@Glavic,你說得對。問題是我將在不同的項目中使用這個類,這些項目有着完全不同的需求。所以項目a將有我將永遠不會在項目b或c中使用的類。因此,我希望能夠將新的類文件轉儲到包含文件夾中,而不必擔心每次啓動新項目時都將它們包含在manualy中。 –

+0

你使用的是PHP + 5.4嗎? –

回答

3

您可以註冊任何可調用的對象作爲參數。

spl_autoload_register(array($object, 'public function name')); 

spl_autoload_register('classname::static_method'); 

應該有所幫助。

+0

你說的ID完全一樣 – boksiora

0

對這個問題的反應引用:在PHP 5.4中,您可以像這樣在內部使用$ this。

這可能是答案。