调用常量会产生难以理解的解析错误

时间:2012-04-13 15:33:46

标签: php class constants syntax-error

我被一个让我疯狂的难以理解的语法错误所阻止:/

显示的错误是Parse error: syntax error, unexpected '.', expecting ',' or ';'

这是代码:

class FamillePieceControllerCore extends FrontController
{
    public $php_self = 'famille-piece.php';

    private $webservice_url = _CICERONE_CONNECT_BASE_URL_ . 'WSC003&P2=0';
}

其他文件中定义了_CICERONE_CONNECT_BASE_URL_

如果我删除. 'WSC003&P2=0',则代码可以正常工作。

我不明白:/感谢您的帮助

ps:我使用的是php 5.3.8

1 个答案:

答案 0 :(得分:4)

您不能使用表达式初始化类属性(如连接)。相反,你必须在构造函数中执行它:

class FamillePieceControllerCore extends FrontController
{
    public $php_self = 'famille-piece.php';

    private $webservice_url;
    public function __construct() {
      $this->webservice_url = _CICERONE_CONNECT_BASE_URL_ . 'WSC003&P2=0';
    }
}

From the documentation:

  

类成员变量称为“属性”。您也可以使用“属性”或“字段”等其他术语来查看它们,但出于本参考的目的,我们将使用“属性”。它们是使用关键字publicprotectedprivate之一定义的,后跟常规变量声明。

     

此声明可能包括初始化,但此初始化必须是常量值 - 也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。

使用define()定义的常量是在运行时定义的,因此在初始化属性时,编译时不知道_CICERONE_CONNECT_BASE_URL_的值。

更新以后的PHP版本:

从PHP 5.6开始,只要仍然可以在编译时评估它们,就可以在类属性声明中使用简单表达式。因此,原始发布的代码将在PHP 5.6+中正确编译和执行。仍然不允许任何需要运行时评估的东西,例如函数调用或变量插值。

// This is okay in PHP 5.6+
public $property = SOME_CONST . " other stuff";

// This is still not possible since
public $property = strlen(SOME_CONST);