我感兴趣的是,如果它可以使用任何技巧,或者很酷的PHP功能,让子类从父级继承,并且与父级具有相同的名称。这应该可以根据需要重复多次。
这可以通过我想象的多种方式完成,但我很想看看社区出现了什么。
我很想知道人们是否认为这是有用的,或者标准继承是否可以接受。
真的是我在其中看到的力量,(假设基础对象是正确构建的)。是一个令人惊讶的长期扩展能力和可维护性,同时是超级专业人士,也不会让你的平均熊对所有生活困惑。
让我们假设我们有一些活跃的记录库类型。
Class Active Record =>联系人
我想覆盖与MyContacts的联系人,但宁愿看到当前使用联系人的系统中的任何地方都无需进行任何改变......而是将其标记为联系人。
有效记录 - >联系人 - > MyContacts(联系方式)。
理论上如上所述应该可以做到。
有效记录 - >联系人 - > MyContacts(联系方式) - > YourContacts(联系方式)。
Anywhere引用的所有联系人仍然不应该提供任何未定义的类,或者在出现时不给予孩子最多的功能。
如果不做像......这样的事情,怎么能实现呢?
$class_name = ClassFactory::instance("Contact");
$class = new $class_name($args);
我们在寻找什么: $ class = new Contacts();
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函数将定义它是否是错误。
答案 0 :(得分: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);
只要您注入的内容实现了Contact接口,它就会起作用。使用您想要避免的工厂方法非常适合和维护。它集中了逻辑,在一个地方组装对象图,然后简单地将正确的对象推送给消费者。