带有可变参数计数的抽象 __construct

问题描述 投票:0回答:1

我有很多这样的 DTO:

class AccountDTO extends AbstractNestedDTO {
    public function __construct(
        FirstNameDTO $firstName,
        LastNameDTO $lastName,
        BirthdayDTO $birthday,
        CompanyDTO $company,
        EmailDTO $email,
        PhoneDTO $phone
    ) {
    }
}
class CompanyDTO extends AbstractNestedDTO {
    public function __construct(
        CompanyNameDTO $companyName,
        CompanyCodeDTO $companyCode,
        CompanyVatCodeDTO $companyVatCode,
    ) {
    }
}

它们都继承自

AbstractNestedDTO
,并且
FirstNameDTO
LastNameDTO
BirthdayDTO
等所有属性都继承自
AbstractDTO

AbstractNestedDTO
中,我试图定义一个“通用”构造函数,如下所示:

abstract public function __construct(AbstractDTO ...$dto);

但是我收到以下致命错误:

Declaration of Hoo\Modules\Account\DTOs\CompanyDTO::__construct(Hoo\Modules\Account\DTOs\CompanyNameDTO $companyName, Hoo\Modules\Account\DTOs\CompanyCodeDTO $companyCode, Hoo\Modules\Account\DTOs\CompanyVatCodeDTO $companyVatCode) must be compatible with Hoo\DTOs\AbstractNestedDTO::__construct(Hoo\DTOs\AbstractDTO ...$dto)

所以这是我的问题:是否可以定义一个适合我所有

NestedDTO
的“通用”构造函数?

php constructor abstract-class
1个回答
0
投票

所以这是我的问题:是否可以定义一个适合我所有

NestedDTO
的“通用”构造函数?

通常情况下,这取决于情况。

自 PHP 5.4.0 以来,你想做的事情不再可能了。

由于所有构造函数都是空的并且不执行任何操作,因此这实际上非常简单:在抽象超类和正在实现的任何纯抽象类中保持构造函数未定义。

因此在

AbstractNestedDTO
中定义一个“通用”构造函数,如下所示:

abstract class AbstractNestedDTO
{
}

如示例所示,抽象超类没有

__constructor()
魔术方法。构造函数方法通常被认为是实现细节,不属于(纯)抽象类。

您可以在开放世界中看到这一点,您发现它通常没有在接口中定义。与那里的Note比较:

尽管支持它们,但强烈建议不要在接口中包含构造函数。这样做会显着降低对象实现接口的灵活性。

由于抽象超类可用于提供纯抽象类(接口)的抽象类实现(抽象类),因此接口通用设计的相同规则适用于不太纯粹和更具体但仍然是抽象类接口。

从您问题中提供的信息来看,我的印象是您不希望在超级级别上实施任何魔法。因此,将神奇的

__construct()
方法从超类中删除。

© www.soinside.com 2019 - 2024. All rights reserved.