字符串表示之外的复杂(卷曲)语法的目的

时间:2013-01-09 15:01:57

标签: php

我理解字符串中复杂(卷曲)语法的用法,但我不理解它在字符串之外的用途。

我刚在CakePHP中找到了这个代码,我无法理解:

// $class is a string containg a class name
${$class} =& new $class($settings);

如果有人能帮助我理解为什么在这里使用,这和它之间有什么区别:

$class =& new $class($settings);

谢谢。

3 个答案:

答案 0 :(得分:4)

最简单的理解方法是通过示例:

class FooBar { }

// This is an ordinary string.
$nameOfClass = "FooBar";

// Make a variable called (in this case) "FooBar", which is the
// value of the variable $nameOfClass.
${$nameOfClass} = new $nameOfClass();

if(isset($FooBar))
    echo "A variable called FooBar exists and its class name is " . get_class($FooBar);
else
    echo "No variable called FooBar exists.";

使用${$something}$$something。在PHP中称为“变量变量”。

因此,在这种情况下,会创建一个名为$FooBar的新变量,变量$nameOfClass仍然只是一个字符串。

答案 1 :(得分:2)

在字符串之外使用复杂(卷曲)语法的示例是在表达式中形成变量名称时,不仅包含一个变量。请考虑以下代码:

$first_name="John";
$last_name="Doe";
$array=['first','last'];
foreach ($array as $element) {
    echo ${$element.'_name'}.' ';
}

在上面的代码中,echo语句将在第一个循环期间输出变量$ first_name的值,并在第二个循环期间输出变量$ last_name的值。如果要删除大括号,echo语句将尝试在第一个循环期间输出变量$ first的值,并在第二个循环期间输出变量$ last的值。但由于未定义这些变量,代码将返回错误。

答案 2 :(得分:0)

第一个示例创建一个动态命名的变量(name是类变量的值),另一个示例覆盖类变量的值。