【问题标题】:How to specify two types in php? [duplicate]如何在php中指定两种类型? [复制]
【发布时间】:2018-10-01 17:17:23
【问题描述】:

我有一个基类:

class DataModel implements IModel
{
}

还有子类:

class DataModelDoctor extends DataModel
{

}

在另一个类的构造函数中,我将传入参数的类型设置为DataModel

public function __construct(DataModel $model)
{}

当我创建类的实例时,我传递了一个 DataModelDoctor() 的实例。

它调用一个错误,因为需要DataModel

所以问,为什么不兼容DataModelDoctorextendDataModel

是否可以设置为:

public function __construct(DataModel | DataModelDoctor $model) {}

【问题讨论】:

    标签: php oop


    【解决方案1】:

    只要 PHP 可以发现 DataModelDoctor 类确实从 DataModel 类扩展,它就可以工作。

    您需要确保,如果它们使用不同的命名空间,您需要显式声明完整的类名,包括其命名空间。例如

    <?php
    
    namespace Some\Other\Namespace2;
    
    use Some\Other\Namespace1\DataModel;
    
    class DataModelDoctor extends DataModel
    {
    }
    

    在上面的示例中,DataModelDataModelDoctor 位于不同的命名空间中。如果您删除上述代码中的use 子句,则DataModel 将被假定为与DataModelDoctor 类具有相同的命名空间。

    在你需要DataModel实例的其他类中,如果它们属于不同的命名空间,那么你需要指定命名空间。

    use Some\Other\Namespace1\DataModel;
    ...
    
    public function __construct(DataModel $model)
    {
    }
    

    更好的方法是使用IModel 接口声明。

    public function __construct(IModel $model)  
    {
        $this->model = $model;
    }
    

    然后你可以传递任何实现IModel的类。

    【讨论】:

    • 如果DataModel 实现IModel 如果我通过new DataModelDoctor() 是否足以像你提供的那样设置?
    • 是的。但实际上您的代码应该与基类一起使用。你能提供你得到的错误吗?
    • @Karabah 正如安东尼所说,您的代码应该可以工作。我用命名空间的解释更新了我的答案。
    猜你喜欢
    • 2018-04-17
    • 2021-09-05
    • 2018-07-20
    • 1970-01-01
    • 2021-08-13
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多