当方法签名必须改变时,如何在PHP中重载子类方法,尊重OOP和SOLID原则?

时间:2017-06-29 20:47:01

标签: php oop solid-principles

当方法签名必须更改时,如何在PHP中重载关于OOP和SOLID原则的PHP子类方法。有一些针对此的设计模式吗?

<?php

class Client extends People
{
    protected function fillData(ClientDTO $clientDTO)
    {
        parent::fillData($clientDTO);
        ...
    }
}

class People
{
    protected function fillData(PeopleDTO $peopleDTO)
    {
        ...
    }
}

class ClientDTO extends PeopleDTO
{
   protected $orders;
}

class PeopleDTO
{
   protected $name;
}

?>

1 个答案:

答案 0 :(得分:1)

我不担心更改方法签名,因为只要ClientDTOPeopleDTO的子类,签名在您的特定情况下是兼容的。您可以将ClientDTO实例传递给People::fillData,它仍然可以使用。所以我想说,从这个角度来看,不用担心。 但是您应该在签名中使用接口代替硬编码的类依赖项。如果您愿意,可以将其称为策略模式。这样,您将尊重Open \ Closed和Dependency Inversion原则,因为您的类将依赖于抽象。或者至少你应该使用一些基础抽象类,如果你认为创建接口是一种过度杀伤,或者你的实体是非常特定于域的。

P.S。我假设您在代码示例中犯了一个错误:class ClientDTO应为class PeopleDTO