2016-07-03 6 views
2

これはPHPに関する基本的な質問ですが、何らかの理由でそれに関する情報が見つかりませんでした。親クラスをパラメータとして関数に渡す

私がしようとしているのは、すべての子クラスも渡すことができるように親クラスを関数に渡すことです。

どうすればいいですか?

function transform(Fruit $fruit){} 

transform($orange) 
transform($apple) 

更新:

私はより多くの状況を表示する必要があるように見えます。

それでは、私が持っていることは、トランス親

class ResourceTransformer{ 
    public function transform(ResourceModel $model){} 
} 

とその子

class ColorTransformer extends ResourceTransformer{} 

ある今、私が何をしたいのかColorTransformerにカラーモデル、ResourceModelの子を渡しています。

私はそれがこのようなエラーがスローされますことをやっている
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はカラーモデルを受け入れるだけResourceModelを受け入れ、まだカラーモデルはResourceModelの子であることはできません。あなたの中にはもっと悟りを与えることができるかもしれない。

+1

クラス名を関数に渡す – splash58

+0

あなたの例でこれを実行しましたか?あなたの例の問題は何ですか? – dbf

+0

今は、子インスタンスを投げることしかできません。 –

答えて

0

私は

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

あなたは問題がColorModelであるが、エラーについての情報がResourceModelColorModelための名前空間が同じであることを教えので、私はこの問題を考えることをコメントで語ったこの部分で

class ColorModel extends ResourceModel{} 

ということと同じではありませんResourceTransformerクラス定義を使用しています - この定義では、ファイルの上のどこかにこのコードがありますか?

use App\Modules\Product\Models\ResourceModel; 

あなたは、あなたがどこかにResourceTransformerクラス定義を使用して、ファイル内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.

がエラーであなたがクラスResourcesTransformerを持っていることを見て、あなたのエラーで

class ResourceTransformer{ 
    public function transform(ResourceModel $model){} 
} 

とクラス名との間の差でありますこのクラスの名前がResourceTransformerであることを教えてください。この相違が無ければ、問題はResourcesTransformerクラスの宣言でファイルに配置する必要があります。

+0

これは正しいです、2つの異なるResourceModelの定義がありがとう、私はそれを台無しにしました。 変圧器が正しいです:) –

+0

私はこれを誤って落として、ロックした後までそれを認識しませんでした。これは非常に包括的な回答です。謝罪します。 –

+0

@ ErikJ.Olson問題はありません、それは起こる、コメントありがとう:) – zajonc

1

あなたは、単に文字列としてクラスの名前を渡し、dinamicallyそれをインスタンス化することができます

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

残念ながら、子インスタンス以外の情報は渡せません。 –

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) 
関連する問題