2012-11-27 58 views
4

我需要獲取已擴展另一個父類的所有聲明類。PHP OOP:獲取已擴展另一個父類的所有聲明類

因此,例如...

class ParentClass { 

} 

class ChildOne extends ParentClass { 

} 

class ChildTwo extends ParentClass { 

} 

class ChildThree { 

} 

我需要輸出這樣的數組:

array('ChildOne', 'ChildTwo') 

我是新來的PHP OOP,但基於一些谷歌搜索,我想出了此解決方案。

$classes = array(); 

foreach(get_declared_classes() as $class) { 
    if (is_subclass_of($class, 'ParentClass')){ 
     array_push($classes, $class); 
    } 
} 

我想問的是,這是做我想做的最好的做法,還是有更好的方法?全球範圍將包含許多其他不屬於ParentClass的子類。循環遍歷所有已聲明的類是最好的方法嗎?

編輯(澄清目的)

我想實現與這個實例擴展父類的每個子類。

我想爲ParentClass的每個孩子做$childone = new ChildOne; $childtwo = new ChildTwo;

+2

據我所知,這是做到這一點的唯一方法。但是你想做什麼?你能避免反思嗎? –

+0

而不是'array_push($ classes,$ class);'我會用:'$ classes [] = $ class;'。無論如何,否則代碼看起來很好。無論如何,這是有點離題,國際海事組織。 – Leri

+0

我同意Will Vousden的觀點,反思會變得緩慢,對於你的開發人員不直觀,IDE不能通過它瀏覽... –

回答

1

你的解決方案似乎很好,但我不知道你爲什麼要這樣做。在php中沒有簡單的方法來說,'全球範圍內給我一個特定父類的所有已聲明的類',而無需在全局範圍內實際檢查每個已聲明的類。即使你有幾百個類加載循環,它們不應該太重,因爲它們都在內存中。

如果您只是想跟蹤特定父級的加載子級,爲什麼不創建一個註冊表來加載它們呢?您可以在用於子類或事件的自動加載器或工廠中進行跟蹤,只需在類定義之前將類放在類文件的頂部即可。

+0

謝謝,您能否進一步解釋如何在自動加載器或工廠中進行跟蹤?據我所知,自動加載器被用來包括未定義的類,當他們正在使用,這是有點不同,我想要的。除非我錯過了一些東西。 – mushroom

+0

@jon類聲明的唯一方法是,如果他們在某個地方使用。在自動加載器中,當您加載類時,將類名稱推送到數組或其他東西。如果你不自動加載或通過命名空間加載它們,那麼你只需要/包括類文件?在這種情況下,只需創建一個類名的數組,並在每次需要某個類時將類名推送到該數組。 – Ray

+0

你說得對,我只是要求班級文件。我有一個文件夾中的所有類,並且包含該目錄中的所有PHP文件。文件名可能不對應於PHP文件中找到的類名稱。 – mushroom

2

您可以嘗試在第一次加載時記錄類的聲明。它假設你正在使用自動加載。

如果你不使用的作曲家,但自定義裝載機:

這是最簡單的方法:

$instanciatedChildren = array();//can be a static attribute of the A class 
spl_autoload_register(function($class)use($instanciatedChildren){ 
    //here the code you use 
    if(is_subclass_of($class,'A')){ 
     $instanciatedChildren[] = $class; 
    } 
} 

如果你用作曲:

你可以做延伸composer/src/Composer/Autoload/ClassLoader.php 類然後重載loadClass方法來添加上面給出的條件。然後註冊新的加載程序並取消註冊舊加載程序。