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

时间:2016-07-03 06:53:06

标签: php oop inheritance

这是一个基本的PHP问题,不知怎的,我找不到任何关于它的信息。

所以我要做的是将父类传递给一个函数,这样它的所有子类也都可以传递。

无论如何都要这样做?

function transform(Fruit $fruit){}

transform($orange)
transform($apple)

更新:

看起来我需要更多地展示这种情况。

所以我拥有的是变压器父母

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的子代。你们中的一些人可能会给我更多的启发。

3 个答案:

答案 0 :(得分:3)

我已尝试过此代码来检查您的问题

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){}
}

和错误中的类名

  

类型错误:传递给App \ Modules \ Product \ Transformer \ ResourcesTransformer :: transform()的参数1必须是App \ Modules \ Product \ Models \ ResourceModel的实例,App \ Modules \ Product \ Models \ ColorModel的实例给出。

看错,你有一个班级ResourcesTransformer,你告诉我们这个班的名字是ResourceTransformer。如果这个差异没问题,那么你的问题应该放在文件中,声明ResourcesTransformer类。

答案 1 :(得分:1)

您可以简单地将类的名称作为字符串传递,并以幻想方式实例化它:

function transform($name_of_class){
...
new $name_of_class;
}

答案 2 :(得分:0)

请检查示例;

<?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 )