2016-11-23 10 views
1

factory私は::classを返したいと思います。しかし、工場では、TypeOneObject,TypeTwoObjectなどと呼ばれる数十種類の異なる型(工場に渡されるオブジェクトの種類によって決まる)を返す可能性があります。変数を使用してこのようなクラスを返すことは可能ですか?PHP工場から変数クラス名を返します

$type = $myrequiredclass->getType(); 
return $type."Object"::class; // wanting TypeOneObject::class 

私は大きなif/thenswitchを行うのに十分簡単なことだろうが、私はそれを避けたいのですが知っている私は、私はいつもPHP Parse error: syntax error, unexpected '::'

を取得し、このreturn文を構築どんなにのように思えます。 $typeインスタンスからクラス名を取得するための最良の方法は、PHP get_class_methods機能を使用することです

class TypeOneObject 
{ 
    public static function whoAreYou() 
    { 
     return 'Type One Object!'; 
    } 
} 

class MyRequiredClass 
{ 
    public function getType() 
    { 
     return 'TypeOne'; 
    } 
} 

class MyFactory 
{ 
    public static function getFactoryObject(MyRequiredClass $class) 
    { 
     $type = $class->getType()."Object"; 
     return $type::class; 
    } 
} 

$object = MyFactory::getFactoryObject(new MyRequiredClass()); 
$object::whoAreYou(); 
+0

'{$型。 "オブジェクト"} :: class'又はおそらくと'() '? [mcve]は簡単なテストに役立ちました。 – Xorifelse

+0

'$ myrequiredclass'には何がありますか? –

+0

'$ type :: class;' 'class 'ビットがそこでやっていると正確に考えていますか?それを削除し、最後の行に 'echo'を追加すれば、すべて設定されます。つまり、私はこの例では工場の目的を見ていません。 –

答えて

0

はここより肉付けシナリオです。これは、クラスインスタンス内のすべてのメソッドを取得します。そこからフィルタリングしてcall_user_funcを使用してメソッドを呼び出し、適切な値を取得できます。

class TypeOneObject 
{ 
    public static function whoAreYou() 
    { 
     return 'Type One Object!'; 
    } 
} 

class MyRequiredClass 
{ 
    public function getType() 
    { 
     return 'TypeOne'; 
    } 
} 

class MyFactory 
{ 
    public static function getFactoryObject(MyRequiredClass $class) 
    { 
     $methods = get_class_methods($class); 
     $method = array_filter($methods, function($method) { 
      return $method == 'getType'; 
     }); 

     $class = new $class(); 
     $method = $method[0]; 
     $methodName = call_user_func([$class, $method]); 
     $objectName = sprintf('%sObject', $methodName); 

     return new $objectName; 
    } 
} 

$object = MyFactory::getFactoryObject(new MyRequiredClass()); 
echo $object::whoAreYou(); 

出力

Type One Object!

関連する問題