Ответ 1
Сначала введите имя класса в переменную:
$classname=$var.'Class';
$bar=new $classname("xyz");
Это часто вид, который вы увидите в шаблоне Factory.
Подробнее см. Пространства имен и динамические языковые функции.
Я знаю, что этот вопрос звучит довольно расплывчато, поэтому я сделаю это более понятным с помощью примера:
$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"));