将变量的字符串用于类名或其他名称

时间:2013-07-17 14:56:33

标签: php class-names

我想在类名中使用变量。

例如,让我们将名为$var的变量设置为“index2”。 现在我想在类名中打印index2,如下所示:

controller_index2,但不是手动执行,我可以像这样打印var名称:

controller_$var;

但我认为这是一个语法错误。

我该怎么做?

    function __construct()
    {
        $this->_section = self::path();

        new Controller_{$this->_section};

    }

5 个答案:

答案 0 :(得分:2)

这是一个可怕的黑客,但是:

php > class foo { function x_1() { echo 'success'; } };
php > $x = new foo;
php > $one = 1;
php > $x->{"x_$one"}();
          ^^^^^^^^^^^^
success

不是尝试在线上构建方法名称,而是一组方法可能更合适。然后你只需使用变量作为数组的键。

答案 1 :(得分:1)

将它作为双引号中的字符串回显。

echo "controller_{$var}";

试试这个(基于OP中的代码):

function __construct()
{
    $this->_section = self::path();

    $controller_name = "Controller_{$this->_section}";

    $controller = new $controller_name;

}

答案 2 :(得分:1)

你可以这样做....遵循这个语法

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);

答案 3 :(得分:0)

试试这个:

  $name = "controller_$var";
  echo $this->$name;

答案 4 :(得分:0)

只是为了添加前面的答案,如果你试图声明具有变量名的新类但是所有构造参数都是相同的并且你正在处理实例化对象,那么你可能不需要不同的类但只是不同的实例。