Php 类变量上的作用域解析运算符

Php 类变量上的作用域解析运算符,php,oop,Php,Oop,我很好奇为什么在类变量上使用scope resolution操作符会导致致命的php错误,以及是否有解决方法 例如: <?php class StaticTest { public static function output() { echo "Output called<br />"; } } Class Test { public $reference; public function __construct()

我很好奇为什么在类变量上使用scope resolution操作符会导致致命的php错误,以及是否有解决方法

例如:

<?php
class StaticTest
{
    public static function output()
    {
        echo "Output called<br />";
    }
}
Class Test
{
    public $reference;

    public function __construct()
    {
        $this -> reference = new StaticTest;
    }

}

$static_test = new StaticTest;
$static_test::output(); //works as intended

$test = new Test;
$test -> reference::output(); //Unexpcted T_PAAMAYIM_NEKUDOTAYIM

$direct_reference = $test -> reference;
$direct_reference::output(); //works, closest solution i have found, but requires the extra line of code / variable
?>

如果您唯一关心的是代码行数和额外变量,那么以下是如何在不创建任何变量的情况下在一行中完成此操作:

call_user_func(array(get_class($test->reference), 'output'));
我认为这相当于:

$direct_reference = $test->reference;
$direct_reference::output();

PHP有各种愚蠢的“这个不能再那个”规则/错误。您只需使用一个变量。
{$test->reference}::output()?当存在潜在的歧义时,大括号总是很好的…如果你尝试
($test->reference)::output()
,它会起作用吗?@Eric这么说真奇怪。。。这显然更好。虽然我确实喜欢好的Paamayim Nekudoaym。好的页面标题分隔符。没有什么比一点希伯来语更能让这一天更愉快了。@Eric或哇,讨厌。虽然我喜欢横向思维,+1我也认为这很糟糕,但OP唯一的抱怨是“需要额外的代码/变量行”,我已经解决了这个问题:-P