Neden bir php nesne sabit bir kullanamıyorum?

3 Cevap php

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"]);

3 Cevap

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
        );
    }
}

Eğer sınıfın kendisi de sürekli init yapabiliyor musunuz? Sonra sadece bunu

class Cheese {

    const WHOA = 'me';

    public eat ()
    {
        return Cheese::WHOA; 

    }

}