访问HEREDOC中数组的类属性

时间:2011-08-22 20:10:40

标签: php heredoc

下面的示例中有两种不同的语法。一个工作,另一个不工作!实际上我希望它反过来。第二种语法对我来说很糟糕。

<?php
class Vodoo
{
    public $foo = array();

    public function __construct()
    {
        $this->foo = array('one' => 1, 'two' => 2, 'three' => 3);
    }

    public function getFoo()
    {
        $return = <<<HEREDOC
<p>$this->foo[one]</p>      // outputs: "Array[one]"
<p>{$this->foo['two']}</p>  // outputs correct: "2"

HEREDOC;
        return $return;
    }
}
$bar = new Vodoo;
echo $bar->getFoo();
?>

可以使用这些花括号并在HEREDOC中引用关联索引吗?

编辑:花括号内的表达式必须按照它出现在字符串外的方式编写!

2 个答案:

答案 0 :(得分:7)

是的,这是有效的。

在heredocs和双引号字符串中,您可以使用{$...}语法,其中...$之后的任何有效PHP表达式。

这类似于Ruby中的#{...}语法。

文档中有一个例子:http://php.net/manual/en/language.types.string.php#example-71

请参阅complex curly syntax

答案 1 :(得分:3)

让我们把它分开来使它更清晰,从有效的那个开始:

<p>{$this->foo['two']}</p>  // outputs correct: "2"

它只是有效。

现在让我们看看另一个,你认为它不起作用:

<p>$this->foo[one]</p>      // outputs: "Array[one]"

这里实际发生的是:

读取

$this->foo作为将转换为字符串的变量名称。那是Array。可比较:

echo $this->foo; # Array

接下来的其余部分只是解析为字符串,这就是你得到的原因

<p>Array[one]</p>

<p>$this->foo[one]</p>      // outputs: "Array[one]"

与以下内容相同:

<p>{$this->foo}[one]</p>      // outputs: "Array[one]"

花括号帮助PHP正确解析。您可以更具体地表达您希望成为带花括号的字符串中的变量表达式的部分。