PHP: расширение массивов статических членов - PullRequest
2 голосов
/ 23 мая 2010

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

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?

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

Ответы [ 2 ]

5 голосов
/ 23 мая 2010

Вы правы, вы можете назначать литералы и константы только при объявлении статической переменной. Обходным решением будет присвоить значение в коде сразу после объявления класса. В 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) в зависимости от порядка их объединения.

1 голос
/ 23 мая 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
)
...