Я знаю, что этот вопрос звучит довольно расплывчато, поэтому я сделаю это более понятным с примера:
$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 ()?
Сначала поместите имя класса в переменную:
$classname=$var.'Class'; $bar=new $classname("xyz");
Это часто вид, который вы увидите завернутым в шаблон Factory.
Дополнительные сведения см. В разделе Пространства имен и динамические языковые функции .
Если вы хотите передать динамические параметры конструктора классу, вы можете использовать этот код:
$reflectionClass = new ReflectionClass($className); $module = $reflectionClass->newInstanceArgs($arrayOfConstructorParameters);
Дополнительная информация о динамических классах и параметрах
Начиная с 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"));