我有一个基类:
class DataModel implements IModel
{
}
儿童班:
class DataModelDoctor extends DataModel
{
}
在另一个类的构造函数中,我将传入参数的类型设置为DataModel
:
public function __construct(DataModel $model)
{}
当我创建类的实例时,我传递了一个DataModelDoctor()
的实例。
它会调用错误,因为需要DataModel
。
因此,问题,为什么它不兼容DataModelDoctor
延伸DataModel
?
是否可以设置如下:
public function __construct(DataModel | DataModelDoctor $model) {}
答案 0 :(得分:2)
只要PHP能够发现DataModelDoctor
类确实从DataModel
类扩展,它就会起作用。
您需要确保,如果它们使用不同的命名空间,则需要显式声明包含其命名空间的完整类名。例如
<?php
namespace Some\Other\Namespace2;
use Some\Other\Namespace1\DataModel;
class DataModelDoctor extends DataModel
{
}
在上面的示例中,DataModel
和DataModelDoctor
位于不同的名称空间中。如果您删除上述代码中的use
子句,则假定DataModel
具有与DataModelDoctor
类相同的命名空间。
在其他需要DataModel
实例的类中,如果它们属于不同的命名空间,则需要指定命名空间。
use Some\Other\Namespace1\DataModel;
...
public function __construct(DataModel $model)
{
}
更好的方法是使用IModel
接口声明。
public function __construct(IModel $model)
{
$this->model = $model;
}
然后你可以传递任何实现IModel
的类。