我感兴趣的是,如果有任何技巧和/或很酷的PHP功能,可以让子类从父类继承并与父类具有相同的名称。 这应该能够根据需要重复多次。
我想这可以通过多种方式完成,但我有兴趣看看社区会出现什么。
我还有兴趣听听人们是否认为这有用,或者标准继承是否同样可以接受。
真的是我在其中看到的力量,(假设基本对象构建正确(。 是惊人的长期扩展能力和可维护性,同时超级专业,也不会让你的普通熊对所有活着的人感到困惑。
假设我们有一些活动的记录库类型。
类活动记录 => 联系人
我想用我的联系人覆盖联系人,但宁愿看到系统中当前使用联系人的任何地方,而不必以任何方式更改......而是被标记为联系人。
活动记录 ->联系人 ->我的联系人(联系人(。
理论上如上所述,应该是可以做到的。
活动记录 ->联系人 -> 我的联系人(联系人( ->您的联系人(联系人(。
"联系人"在引用的任何位置仍不应提供任何未定义的类,或者无论何时存在,都不应提供子项的大多数功能。
如果不做这样的事情,怎么能做到这一点......
$class_name = ClassFactory::instance("Contact");
$class = new $class_name($args);
我们正在寻找什么: $class = 新联系人((;
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函数将定义它是否是错误。
你要找的是接口。将联系人定义为接口,然后在应用程序中使用它。这样,您就不必更改所有代码,而只需更改创建特定实例的代码:
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);
只要您在那里注入的内容实现了联系人接口,它就会起作用。使用您想要避免的工厂方法非常适合并且可维护。它将逻辑集中到一个地方组装您的对象图,然后简单地将正确的对象推送给消费者。