2013-09-24 183 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); 

而且只要它会工作为你注入什么有实现的接触界面。使用工厂方法你想避免的是完全适合和可维护的。它专注于将逻辑组装到一个地方,然后将正确的对象推送给消费者。