PHP: statik üye diziler genişletme

2 Cevap php

Ben şu senaryoyu yaşıyorum:

class A { public static $arr=array(1,2); }
class B extends A { public static $arr=array(3,4); }

Bu 2 diziler böylece B::$arr birleştirmek için herhangi bir yolu var mı 1,2,3,4?

I don't need to alter these arrays, but I can't declare them als const, as PHP doesn't allow const arrays.http://stackoverflow.com/questions/ask The PHP manual states, that I can only assign strings and constants, so parent::$arr + array(1,2) won't work, but I think it should be possible to do this.

2 Cevap

Statik değişkeni bildirirken Haklısın, sadece değişmezleri ve sabitler atayabilirsiniz. Iş çevresinde sınıf ilan hemen sonra kod değerini atamak olacaktır. Java statik initialiser ile güzel bu yapabileceğini, ancak PHP ya bu desteklemiyor, bu yüzden biz kendimizi tanımlamak ve bir yöntemi çağırmak zorunda:

class A { public static $arr=array(1,2); }
class B extends A {
  public static $arr;
  public static function init() {
    self::$arr = array_merge(parent::$arr, array(3,4));
  }
}; B::init();

Eğer düşündüğünüz gibi onlar özdeş sayısal tuşları gibi sendika operatör, diziler birleştirmek olmaz - - ilk de array_merge yerine birliğin (+) operatörünün kullanımına dikkat array(0=>1, 1=>2), ikinci array(0=>3, 1=>4) arasından seçilir; Bunların birliği, sadece her tuşa bir kez içerecektir, bu nedenle ya (1,2) veya (3,4) sırayla size sendika onlara bağlı olan bitireceğiz.

Evet, sadece statik bir değişken tanımlamak mümkün olmayacak gibi biraz fantezi almak gerekiyor.

<?php

class A 
{
    public static $arr = array(1, 2);
    public static function getArr(){ return self::$arr; }
}

class B extends A 
{
    public static $arr = array(3, 4);
    public static function getArr(){ return array_merge(parent::$arr, self::$arr); }
}


print_r( A::getArr() );
print_r( B::getArr() );

Çıktı:

Array
(
    [0] => 1
    [1] => 2
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

Çok orijinal dizileri erişebilirsiniz beri de iyi:

print_r( A::$arr );
print_r( B::$arr );

Array
(
    [0] => 1
    [1] => 2
)
Array
(
    [0] => 3
    [1] => 4
)