当方法签名必须更改时,如何重载 PHP 中的子 class 方法,尊重 OOP 和 SOLID 原则?
How to overload child class methods in PHP, respecting OOP and SOLID principles, when method signature must change?
当方法签名必须更改时,如何根据 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;
}
?>
在这里我不会担心更改方法签名,因为只要 ClientDTO
是 PeopleDTO
的子 class,签名在您的特定情况下是兼容的。您可以将 ClientDTO
实例传递给 People::fillData
,它仍然可以工作。所以我想说,从这个角度来看不用担心。
但是您应该在签名中使用接口来代替硬编码的 class 依赖项。如果需要,您可以将其称为策略模式。这样,您将尊重 Open\Closed 和依赖倒置原则,因为您的 classes 将依赖于抽象。或者至少你应该使用一些基础抽象 class 如果你认为创建接口是一种矫枉过正,或者你的实体是非常特定于领域的。
P.S。我假设您在代码示例中犯了一个错误:class ClientDTO
应该是 class PeopleDTO
当方法签名必须更改时,如何根据 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;
}
?>
在这里我不会担心更改方法签名,因为只要 ClientDTO
是 PeopleDTO
的子 class,签名在您的特定情况下是兼容的。您可以将 ClientDTO
实例传递给 People::fillData
,它仍然可以工作。所以我想说,从这个角度来看不用担心。
但是您应该在签名中使用接口来代替硬编码的 class 依赖项。如果需要,您可以将其称为策略模式。这样,您将尊重 Open\Closed 和依赖倒置原则,因为您的 classes 将依赖于抽象。或者至少你应该使用一些基础抽象 class 如果你认为创建接口是一种矫枉过正,或者你的实体是非常特定于领域的。
P.S。我假设您在代码示例中犯了一个错误:class ClientDTO
应该是 class PeopleDTO