将父类作为参数传递给函数


Pass a parent class as a parameter to a function

这是一个基本的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有关,但你关于错误的信息告诉我们ResourceModelColorModel的名称空间是相同的,所以我认为问题是与你的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 )