使用变量';s字符串转换为类名或其他


Use variable's string into class names or other

我想在类名中使用变量。

例如,让我们将一个名为$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;

在前面的答案的基础上,如果你试图用变量名声明新的类,但所有的构造参数都是相同的,并且你对待实例化对象都是一样的,也许你不需要不同的类,只需要相同的不同实例。