Bu neden çalışmıyor?
define("STR_TEST", "qwerty");
class Test
{
public $arrTest = array(
"test"=>"Bla bla bla ".STR_TEST
);
}
$objTest = new Test();
print($objTest->arrTest["test"]);
Sen mükemmel sınıf üyesi beyannamelerinde sabitleri kullanabilirsiniz
define('SOME', 12345);
class A {
public $x = SOME; // works
}
$o = new A;
echo $o->x;
Sorun üyesi bildirimleri her türlü ifadelere izin kalmamasıdır:
class B {
public $x = 1 + 1; // no
public $y = foo(); // no
public $z = CONST . CONST; // no
}
Bu sınırlama ne sebeple olursa olsun, sadece orada ifadeleri kabul etmez, yani, php ayrıştırıcı, tamamen sözdizimsel olduğunu unutmayın. Bu üye beyannamelerinde zamanı bağımlı kodu olması oldukça mümkündür:
define('IP', $_SERVER['REMOTE_ADDR']);
class B {
public $ip = IP;
}
$o = new B;
echo $o->ip;
Yani, yukarıda alıntılanan belgeler bu noktada yanlış.
Sen sadece bir property declaration basit değerlerini kullanabilirsiniz:
[] Bildirimi bir başlatma içerebilir, fakat bu başlatma sabit bir değer olmalıdır - yani, bu derleme zamanında değerlendirilmesi gerekir ve değerlendirilmesi amacıyla çalışma zamanı bilgileri bağlı olmamalıdır.
Özellikle birleştirme operatörü bu noktada izin verilmez. Eğer diğer değerlerden türetilen bir değer ile başlatmak istiyorsanız, yapıcı yapmak gerekir:
class Test {
public $arrTest;
public function __construct() {
$this->arrTest = array(
"test" => "Bla bla bla ".STR_TEST
);
}
}