0

我很感兴趣,如果它可能有任何诡计,或者很酷的 PHP 特性,让一个子类从父类继承并与父类具有相同的名称。这应该能够根据需要重复多次。

我认为这可以通过多种方式完成,但我很想看看社区会出现什么。

我也很想知道人们是否认为这很有用,或者标准继承是否同样可以接受。

真的是我在其中看到的力量,(假设基础对象构建正确)。具有惊人的长期扩展能力和可维护性,同时是超级专业人士,也不会让你的普通熊对所有活生生的人感到困惑。

让我们假设我们有一些活跃的记录库类型。

类 Active Record => 联系人

我想用 MyContacts 覆盖联系人,但宁愿看到系统中当前使用联系人的任何地方都不必更改……而是将其标记为联系人。

Active Record -> 联系人 -> MyContacts(联系人)。

理论上如上所述应该可以做到。

Active Record -> 联系人 -> MyContacts (联系人) -> YourContacts (联系人)。

引用任何地方的联系人仍不应提供任何未定义的类,或者在出现时不提供孩子的大部分功能。

如果不做类似的事情怎么能做到这一点......

$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 函数将定义它是否是错误。

4

1 回答 1

1

您正在寻找的是接口。将您的联系人定义为接口,然后在您的应用程序中使用它。这样您就不必更改所有代码,而只需更改创建特定实例的代码:

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 接口,它就会起作用。使用您想要避免的工厂方法非常适合并且可维护。它将逻辑集中在一个地方组装您的对象图,然后简单地将正确的对象推送给消费者。

于 2013-09-24T08:51:33.970 回答