2013-08-31 34 views
1

假設我有一個類Core(),它將根據某些初始化爲我提供不同類的實例。說開始後,我得到一些課,然後想要實例化。這是我做的:實例化的較短途徑PHP類

$core = new Core(); 
// $core is further initiated 
$api = $core->getClass(); // This returns, for instance class Library_MyClass 
$class = new $api(); 

有沒有辦法將最後兩個步驟合併爲一個?因此,例如我說了一些像$class = new $core->getClass()()?顯然我寫的是錯誤的,但這就是我想要的!那可能嗎?

+0

通常情況下,你不會在課堂上有課。你應該讓他們分開,我會想。 –

回答

1

如果這是某種形式的一個工廠,你可以這樣做的:

class Core 
{ 
    public function getClass() 
    { 
     return new Library_MyClass(); 
    } 
} 

$core = new Core(); 
$class = $core->getClass(); 

但是考慮到類Core的名字,我懷疑你在這裏可以違反一些SOLID principles

+0

是的,它應該像'getLibraryInstance()'。 – Starx

+0

「核心」這個名字就是一個例子。我有一個不同的名字。你的解決方案的問題是,我想給該類進行一些初始化,即'new $ class($ param1,...)',因爲根據我得到的類,我可能會或可能不會傳遞參數, ,我寧願我的'Core'只返回類名,稍後我會自己實例化它。 – Kousha

+0

SOLID原則聽起來像是他們在微軟總部會有的激勵海報。試驗你能做的只是編程中一半的樂趣(實際上更多)。尤其是開放源代碼:)新技巧 - 稍後再增加新功能。此外,我想我對海報想要做什麼有所瞭解,可能會加載php類文件。 – Jason

0

您可能希望從使用的dependency injection受益(考慮應用於PeeHaa例如輕微更新)

class Core 
{ 
    public function getClass($api) 
    { 
     return new $api(); 
    } 
} 

$core = new Core(); 
$apiInstance = $core->getClass('Library_MyClass'); 

這樣你就不必更新Core類,只要你想它提供你有另一個庫類的實例。