回答:
はい、できます!
$str = 'One';
$class = 'Class'.$str;
$object = new $class();
名前空間を使用する場合は、完全修飾名を指定します。
$class = '\Foo\Bar\MyClass';
$instance = new $class();
PHPで実行できるその他のクールなものは次のとおり
です。
$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123
そして変数関数とメソッド。
$func = 'my_function';
$func('param1'); // calls my_function('param1');
$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method.
$my_obj = Package\$class_name();
。代わりに、次のことを行う必要があります$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
$className = '\Foo\Bar\MyClass';
$instance = new $className();
$model = $user_model::find()->All();
どこ$user_model
次の構文を使用して新しいクラスを作成できます(これは、ファクトリを作成する場合に便利です)。
$className = $whatever;
$object = new $className;
(並外れて粗い)ファクトリーメソッドの例として:
public function &factory($className) {
require_once($className . '.php');
if(class_exists($className)) return new $className;
die('Cannot create new "' . $className . '" class - includes not found or class unavailable.');
}
require_once($className.'php');
->require_once($className.'.php');
http://www.php.net/manual/en/language.oop5.basic.phpの例3を見てください。
$className = 'Foo';
$instance = new $className(); // Foo()
ClassOne
次のように定義されているとしましょう:
public class ClassOne
{
protected $arg1;
protected $arg2;
//Contructor
public function __construct($arg1, $arg2)
{
$this->arg1 = $arg1;
$this->arg2 = $arg2;
}
public function echoArgOne
{
echo $this->arg1;
}
}
PHPリフレクションの使用。
$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);
新しいインスタンスを作成します。
$instance = $class->newInstanceArgs(["Banana", "Apple")]);
メソッドを呼び出す:
$instance->echoArgOne();
//prints "Banana"
メソッドとして変数を使用します。
$method = "echoArgOne";
$instance->$method();
//prints "Banana"
生の文字列を使用してオブジェクトを作成する代わりにReflectionを使用すると、オブジェクトをより適切に制御し、テストしやすくなります(PHPUnitはReflectionに大きく依存しています)