PHP: расширение статических массивов членов

У меня следующий сценарий:

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

Есть ли способ объединить эти 2 массива, чтобы B::$arr было 1,2,3,4?

Мне не нужно изменять эти массивы, но я не могу объявить их константными, поскольку PHP не допускает константные массивы. https://stackoverflow.com/questions/ask В руководстве по PHP указано, что я могу назначать только строки и константы, поэтому parent::$arr + array(1,2) не будет работать, но я думаю, что это должно быть возможно.


person tstenner    schedule 23.05.2010    source источник


Ответы (2)


Вы правы, вы можете назначать литералы и константы только при объявлении статической переменной. Обходным решением было бы присвоить значение в коде сразу после объявления класса. В Java вы могли бы сделать это с помощью статического инициализатора, но PHP их тоже не поддерживает, поэтому мы должны сами определить и вызвать метод:

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

Также обратите внимание на использование array_merge вместо оператора объединения (+) - оператор объединения не будет объединять массивы, как вы предполагали, поскольку они имеют идентичные числовые ключи - первый - array(0=>1, 1=>2), второй - array(0=>3, 1=>4); их объединение будет содержать каждый ключ только один раз, поэтому вы получите либо (1,2), либо (3,4) в зависимости от порядка их объединения.

person Chris    schedule 23.05.2010
comment
Дох, ты победил меня. Тем не менее мне больше нравится мое решение, так как нет зависимости от init(). - person typeoneerror; 23.05.2010
comment
Я просто использовал массив (1,2) в качестве примера, в проекте это ассоциативный массив, поэтому + будет работать. - person tstenner; 23.05.2010
comment
Невозможно использовать this в статическом контексте. Попробуйте статический/самостоятельный. - person webbiedave; 23.05.2010

Да, вам просто нужно немного пофантазировать, поскольку вы не сможете определить статическую переменную.

<?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() );

Вывод:

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

Также хорошо, поскольку вы также можете получить доступ к исходным массивам:

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

Array
(
    [0] => 1
    [1] => 2
)
Array
(
    [0] => 3
    [1] => 4
)
person typeoneerror    schedule 23.05.2010
comment
Также хороший ответ, но массивы будут объединяться каждый раз, когда я хочу получить к ним доступ, и наследование, если из B должно работать, getArr() должно вызывать parent::getArr(), а не parent::$arr. - person tstenner; 23.05.2010
comment
Истинный. Я все равно не думаю, что наследование и статические свойства имеют большой смысл. Хоть что работает. - person typeoneerror; 23.05.2010