PHP: Extending static member arrays
I'm having the following scenario:
class A { public static $arr=array(1,2); }
class B extends A { public static $arr=array开发者_JAVA百科(3,4); }
Is there any way to combine these 2 arrays so B::$arr
is 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.https://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.
You're correct, you can only assign literals and constants when declaring a static variable. The work-around would be to assign the value in code just after the class is declared. In Java you could do this nicely with a static initialiser, but PHP doesn't support those either, so we have to define and call a method ourselves:
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();
Also note the use of array_merge
instead of the union (+
) operator - the union operator won't combine the arrays as you intend, as they have identical numerical keys - the first is array(0=>1, 1=>2)
, second is array(0=>3, 1=>4)
; the union of them will only contain each key once, so you'll either end up with (1,2)
or (3,4)
depending on the order you union them.
Yes, you just need to get a bit fancy as you won't be able to define a static variable.
<?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() );
Output:
Array
(
[0] => 1
[1] => 2
)
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
Also good since you can access the original arrays too:
print_r( A::$arr );
print_r( B::$arr );
Array
(
[0] => 1
[1] => 2
)
Array
(
[0] => 3
[1] => 4
)
精彩评论