这是一个基本的PHP问题,不知怎么的,我找不到任何关于它的信息。
所以我要做的是传递一个父类给一个函数,所以它的所有子类也可以传递。
有办法吗?
function transform(Fruit $fruit){}
transform($orange)
transform($apple)
更新:
看来我需要更多地展示情况。
所以我有一个transformer父元素
class ResourceTransformer{
public function transform(ResourceModel $model){}
}
及其子元素
class ColorTransformer extends ResourceTransformer{}
现在我要做的是传递ColorModel,一个资源模型的子元素给ColorTransformer。
class ColorModel extends ResourceModel{}
当我这样做的时候,它会抛出一个错误,像这样:
Type error: Argument 1 passed to App''Modules''Product''Transformer''ResourcesTransformer::transform() must be an instance of App''Modules''Product''Models''ResourceModel, instance of App''Modules''Product''Models''ColorModel given.
所以基本上,ColorTransformer不能接受ColorModel而只能接受ResourceModel,然而ColorModel是ResourceModel的子元素。也许你们中的一些人可以给我更多的启发。
我已经试过这个代码来检查你的问题
class ResourceModel { }
class ResourceTransformer
{
public function transform(ResourceModel $model)
{
var_dump($model);
}
}
class ColorTransformer extends ResourceTransformer { }
class ColorModel extends ResourceModel { }
$transformer = new ColorTransformer();
$model = new ColorModel();
$transformer->transform($model);
,我得到了正确的结果
object(ColorModel)#2 (0) {}
如果这在你的情况下不起作用,那么它看起来像ResourceModel
类从你的代码的这一部分
class ResourceTransformer{
public function transform(ResourceModel $model){}
}
与本部分
不一样class ColorModel extends ResourceModel{}
你在评论中说问题只与ColorModel
有关,但你关于错误的信息告诉我们ResourceModel
和ColorModel
的名称空间是相同的,所以我认为问题是与你的ResourceTransformer
类定义有关-你是否在这个定义的文件顶部的某个地方有这个代码?
use App'Modules'Product'Models'ResourceModel;
如果你不这样做,那么你有ResourceModel
类的另一个声明在你的文件某处与ResourceTransformer
类定义?
我在你的问题中看到的另一件事是这部分代码
class ResourceTransformer{
public function transform(ResourceModel $model){}
}
错误中的和类名
类型错误:参数1传递给App'Modules'Product'Transformer' resourcestrtransformer::transform()必须是App'Modules'Product'Models'ResourceModel的实例,给出App'Modules'Product'Models'ColorModel的实例。
看,在错误中你有一个类ResourcesTransformer
,你告诉我们这个类被命名为ResourceTransformer
。如果这个差异是ok的,那么你的问题应该放在文件与ResourcesTransformer
类的声明。
您可以简单地将类名作为字符串传递并动态实例化它:
function transform($name_of_class){
...
new $name_of_class;
}
请查看示例;
<?php
// function transform(Fruit $fruit){ //or
function transform($fruit){
print_r($fruit);
}
class Fruit{
public $name = null;
function __construct($name){
$this->name = $name;
}
}
transform(new Fruit('Apple')); // result: Fruit Object ( [name] => Apple )
echo '<br />';
$orange = new Fruit('Orange');
transform($orange); // result: Fruit Object ( [name] => Orange )