2013-09-24 94 views
0

我有興趣瞭解它是否可能存在任何欺騙,或者酷PHP功能讓子類從父類繼承,並且具有與父類相同的名稱。這應該能夠根據需要重複多次。PHP繼承:子類與父類具有相同的類名

這可以通過很多方式來完成,但我很想看看社區發生了什麼。

我很有興趣也聽到人們是否認爲這很有用,或者標準繼承是否可以接受。

真的,我看到它的力量,(假設基礎對象構建正確)。是非常長遠的延伸能力和可維護性,同時也是超級贊成,同時也不會讓你的平均負擔困擾所有生靈。

讓我們假裝我們有一些活躍的記錄基類型。

類活動記錄=>聯繫人

我要重寫與MyContacts聯繫,但寧願看到到處都在目前使用聯繫人不具備系統的改變反正無論如何......,而是被冠以聯繫。

活動記錄 - >聯繫人 - >我的聯繫人(聯繫人)。

理論上如上所述,應該可以做到。

活動記錄 - >聯繫人 - >我的聯繫人(聯繫人) - >您的聯繫人(聯繫人)。

Anywhere引用應該仍然沒有給出任何未定義的類,或者不提供孩子最多的功能。

怎麼會這樣沒有做這樣的事情......實現

$class_name = ClassFactory::instance("Contact"); 
$class = new $class_name($args); 

我們正在尋找: $類=新的聯繫人();

Where $class could be the newest version of Contacts 


Active Record => Contacts 
Active Record => Contacts -> MyContacts (Contact) 
Active Record => Contacts -> MyContacts (Contact) -> YourContacts (Contact). 

$class->undefinedFun(); 

接受的情況下 - >絕對基類,或任何類的teirs的__call函數將如果它是一個錯誤或不限定。

+1

命名空間也許?但是,使用類工廠有什麼問題(可以簡化爲實際返回實例,而不僅僅是類名) –

回答

1

你在找什麼是interfaces。將聯繫人定義爲接口,然後在您的應用程序中使用它。這樣,你就不必改變所有的代碼只是該代碼創建一個特定實例:如果你做這種方式

interface Contact 
{ 
    public function doSomething(); 
} 

class Whatever extends Something implements Contact 
{ 
    public function doSomething() 
    { 
     // do something in a particular way 
    } 
} 

class SomethingUsingContacts 
{ 
    public function useContact(Contact $contact) 
    { 
     $contact->doSomething(); 
    } 
} 

,你不必所有的客戶端改寫,但可以簡單地換出具體實施,例如你可以做

$somethingUsingContacts = new SomethingUsingContacts; 
$somethingUsingContacts->useContact(new Whatever); 

,當你不這樣做不管了,你可以

$somethingUsingContacts->useContact(new OtherWhatever); 

而且只要它會工作爲你注入什麼有實現的接觸界面。使用工廠方法你想避免的是完全適合和可維護的。它專注於將邏輯組裝到一個地方,然後將正確的對象推送給消費者。