这是一个基本的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的子代。你们中的一些人可能会给我更多的启发。
答案 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
,但您的错误信息告诉我们ResourceModel
和ColorModel
的命名空间是相同的,所以我认为问题出在您的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 )