PHP 继承:子级与父级具有相同的类名


PHP Inheritance: Child has same class name as parent

我感兴趣的是,如果有任何技巧和/或很酷的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);

只要您在那里注入的内容实现了联系人接口,它就会起作用。使用您想要避免的工厂方法非常适合并且可维护。它将逻辑集中到一个地方组装您的对象图,然后简单地将正确的对象推送给消费者。