создать экземпляр класса из переменной в PHP?

Я знаю, что этот вопрос звучит довольно расплывчато, поэтому я сделаю это более понятным с примера:

$var = 'bar'; $bar = new {$var}Class('var for __construct()'); //$bar = new barClass('var for __construct()'); 

Это то, что я хочу сделать. Как бы вы это сделали? Я не мог использовать eval () следующим образом:

 $var = 'bar'; eval('$bar = new '.$var.'Class(\'var for __construct()\');'); 

Но я предпочел бы держаться подальше от eval (). Есть ли способ сделать это без eval ()?

Solutions Collecting From Web of "создать экземпляр класса из переменной в PHP?"

Сначала поместите имя класса в переменную:

 $classname=$var.'Class'; $bar=new $classname("xyz"); 

Это часто вид, который вы увидите завернутым в шаблон Factory.

Дополнительные сведения см. В разделе Пространства имен и динамические языковые функции .

Как передать параметры динамического конструктора

Если вы хотите передать динамические параметры конструктора классу, вы можете использовать этот код:

 $reflectionClass = new ReflectionClass($className); $module = $reflectionClass->newInstanceArgs($arrayOfConstructorParameters); 

Дополнительная информация о динамических классах и параметрах

PHP> = 5.6

Начиная с PHP 5.6 это можно упростить, используя Argument Unpacking :

 // The "..." is part of the language and indicates an argument array to unpack. $module = new $className(...$arrayOfConstructorParameters); 

Спасибо DisgruntledGoat за это.

Если вы используете пространства имен

В моих собственных выводах я думаю, что хорошо упомянуть, что вы (насколько я могу судить) должны объявить полный путь пространства имен для класса.

MyClass.php

 namespace com\company\lib; class MyClass { } 

index.php

 namespace com\company\lib; //Works fine $i = new MyClass(); $cname = 'MyClass'; //Errors //$i = new $cname; //Works fine $cname = "com\\company\\lib\\".$cname; $i = new $cname; 
 class Test { public function yo() { return 'yoes'; } } $var = 'Test'; $obj = new $var(); echo $obj->yo(); //yoes 

Я бы рекомендовал call_user_func() или call_user_func_array php. Вы можете проверить их здесь ( call_user_func_array , call_user_func ).

пример

 class Foo { static public function test() { print "Hello world!\n"; } } call_user_func('Foo::test');//FOO is the class, test is the method both separated by :: //or call_user_func(array('Foo', 'test'));//alternatively you can pass the class and method as an array 

Если у вас есть аргументы, которые вы передаете методу, используйте call_user_func_array() .

пример.

 class foo { function bar($arg, $arg2) { echo __METHOD__, " got $arg and $arg2\n"; } } // Call the $foo->bar() method with 2 arguments call_user_func_array(array("foo", "bar"), array("three", "four")); //or //FOO is the class, bar is the method both separated by :: call_user_func_array("foo::bar"), array("three", "four"));