我想在类名中使用变量。
例如,让我们将一个名为$var
的变量设置为"index2"。现在我想在类名称中打印index2
,如下所示:
controller_index2
,但我可以像这样打印var名称,而不是手动操作:
controller_$var;
但我认为这是语法错误。
我该怎么做?
function __construct()
{
$this->_section = self::path();
new Controller_{$this->_section};
}
这是一个可怕的黑客攻击,但是:
php > class foo { function x_1() { echo 'success'; } };
php > $x = new foo;
php > $one = 1;
php > $x->{"x_$one"}();
^^^^^^^^^^^^
success
与其尝试将方法名称动态构建为字符串,方法数组可能更合适。然后,您只需将变量用作数组的键。
将其作为双引号中的字符串进行回显。
echo "controller_{$var}";
试试这个(基于你在OP中的代码):
function __construct()
{
$this->_section = self::path();
$controller_name = "Controller_{$this->_section}";
$controller = new $controller_name;
}
您可以这样做。。。。遵循以下语法
function __construct()
{
$this->_section = self::path();
$classname = "Controller_".$this->_section;
$instance = new $classname();
}
从字符串定义创建对象的另一种方法是使用ReflectionClass
$classname = "Controller_".$this->_section;
$reflector = new ReflectionClass($classname);
如果你的类名没有构造函数参数
$obj = $reflector->newInstance();
如果你需要将参数传递给构造函数,你可以使用
$obj = $reflector->newInstance($arg1, $arg2);
或者如果你在数组中有你的参数
$obj = $reflector->newInstanceArgs($argArray);
试试这个:
$name = "controller_$var";
echo $this->$name;
在前面的答案的基础上,如果你试图用变量名声明新的类,但所有的构造参数都是相同的,并且你对待实例化对象都是一样的,也许你不需要不同的类,只需要相同的不同实例。