在字符串中访问对象的方法

时间:2012-10-20 22:53:37

标签: php string string-interpolation

最近我正在阅读php文档,并在字符串部分找到了有趣的注释:

  自PHP 5起,

函数,方法调用,静态类变量和{$}内的类常量工作。但是,访问的值将被解释为范围中变量的名称字符串已定义。使用单个花括号({})不能用于访问函数或方法的返回值或类常量或静态类变量的值。

请参阅www.php.net/manual/en/language.types.string.php

它说,我不能使用卷曲语法来获取object的方法调用返回的值。 这是手动中的错误还是我误解了它,因为我尝试了以下代码并且它的工作正常:

<?php
class HelloWorld
{
    public static function hello() 
    {
        echo 'hello';
    }
}
$a = new HelloWorld();

echo "{$a->hello()} world";

2 个答案:

答案 0 :(得分:3)

PHP DOC Says

  

不能用于访问函数或方法的返回值或类常量或静态类变量的值

$a->hello()不是如何调用PHP中的静态方法而不是常量或静态类变量这是他们的意思:

class HelloWorld {
    const A = "A";//                <---- You can not use it for this 
    public static $B = "B";         <---- or this  

    public static function hello() {
        echo 'hello';
    }
}


$a = new HelloWorld();
$A = "{HelloWorld::A} world";       <-------- Not Work
$B = "{HelloWorld::$B} world";      <-------- Not Work
$C = "{HelloWorld::hello()} world"; <-------- Not Work

如果你现在尝试

$A = "X";    // If you don't define this it would not work
$B = "Y" ;   //<------------- -^

echo "{${HelloWorld::A}} world";  
echo "{${HelloWorld::$B}} world"; 

输出

X world           <--- returns X world instead of A
Y world           <--- returns Y world instead of B

答案 1 :(得分:0)

我从这个解释中理解的是,压力在于

  

(...)使用单个花括号......

所以在这个例子里,我想它想说:

echo "I'd like an {$beers::$ale}\n";因此无法使用单个花括号 这就是为什么你应该使用双花括号,第一个将返回静态输出,第二个将返回最终输出,如下例所示:

echo "I'd like an {${beers::$ale}}\n";
                  ^ ^           ^^