如何在php中指定两种类型?

时间:2018-04-20 23:35:16

标签: php oop

我有一个基类:

class DataModel implements IModel
{
}

儿童班:

class DataModelDoctor extends DataModel
{

}

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

public function __construct(DataModel $model)
{}

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

它会调用错误,因为需要DataModel

因此,问题,为什么它不兼容DataModelDoctor延伸DataModel

是否可以设置如下:

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

1 个答案:

答案 0 :(得分:2)

只要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的类。