为什么我不能在php对象中使用常量?

0 php object

为什么这不起作用?

define("STR_TEST", "qwerty");

class Test
{
    public $arrTest = array(
        "test"=>"Bla bla bla ".STR_TEST
    );
}

$objTest = new Test();

print($objTest->arrTest["test"]);
Run Code Online (Sandbox Code Playgroud)

use*_*291 8

您可以在类成员声明中完美地使用常量

define('SOME', 12345);

class A {
    public $x = SOME; // works
}

$o = new A;
echo $o->x; 
Run Code Online (Sandbox Code Playgroud)

问题是成员声明不允许任何类型的表达式:

class B {
    public $x = 1 + 1; // no
    public $y = foo(); // no
    public $z = CONST . CONST; // no
}
Run Code Online (Sandbox Code Playgroud)

请注意,这种限制纯粹是语法上的,也就是说,无论出于何种原因,php解析器都不接受那里的表达式.在成员声明中很可能有与运行时相关的代码:

define('IP', $_SERVER['REMOTE_ADDR']);

class B {
    public $ip = IP;
}

$o = new B;
echo $o->ip;
Run Code Online (Sandbox Code Playgroud)

也就是说,上面引用的文档在这一点上是错误的.


Gum*_*mbo 6

您只能在属性声明中使用简单值:

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

特别是在那时不允许连接运算符.如果要使用从其他值派生的值启动它,则需要在构造函数中执行此操作:

class Test {
    public $arrTest;

    public function __construct() {
        $this->arrTest = array(
            "test" => "Bla bla bla ".STR_TEST
        );
    }
}
Run Code Online (Sandbox Code Playgroud)