我遇到以下情况:
class A { public static $arr=array(1,2); }
class B extends A { public static $arr=array(3,4); }
有没有办法合并这两个数组,B::$arr
是1,2,3,4
?
我不需要改变这些数组,但我不能将它们声明为als const,因为PHP不允许使用const数组。https://stackoverflow.com/questions/ask
PHP手册指出,我只能分配字符串和常量,因此parent::$arr + array(1,2)
不起作用,但我认为应该可以这样做。
答案 0 :(得分:5)
你是对的,你只能在声明一个静态变量时指定文字和常量。解决方法是在声明类之后立即在代码中赋值。在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
而不是union(+
)运算符 - union运算符不会按照您的意图组合数组,因为它们具有相同的数字键 - 第一个是{ {1}},第二个是array(0=>1, 1=>2)
;它们的联合只会包含每个键一次,因此您最终会得到array(0=>3, 1=>4)
或(1,2)
,具体取决于您合并它们的顺序。
答案 1 :(得分:1)
是的,你只需要有点花哨,因为你将无法定义静态变量。
<?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
)