为什么这不起作用?
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)
您可以在类成员声明中完美地使用常量
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)
也就是说,上面引用的文档在这一点上是错误的.
您只能在属性声明中使用简单值:
[声明]声明可能包含初始化,但此初始化必须是常量值 - 也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估.
特别是在那时不允许连接运算符.如果要使用从其他值派生的值启动它,则需要在构造函数中执行此操作:
class Test {
public $arrTest;
public function __construct() {
$this->arrTest = array(
"test" => "Bla bla bla ".STR_TEST
);
}
}
Run Code Online (Sandbox Code Playgroud)