2010-05-23 108 views
2

我有以下情形:PHP:扩展静态成员阵列

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

有什么办法这2个阵,因此B::$arr1,2,3,4结合?

我不需要改变这些数组,但是我不能声明它们是als const,因为PHP不允许const数组。 https://stackoverflow.com/questions/ask PHP手册指出,我只能分配字符串和常量,所以parent::$arr + array(1,2)将不起作用,但我认为应该可以做到这一点。

回答

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,而不是工会( +)运算符 - 联合运算符不会按照您的意图组合阵列,因为它们具有相同的数字键 - 第一个是array(0=>1, 1=>2),第二个是array(0=>3, 1=>4);他们的联合只会包含每个键一次,因此根据您将它们组合的顺序,您最终会得到(1,2)(3,4)

+0

卫生署,你打我。仍然我更喜欢我的解决方案,因为没有init()依赖。 – typeoneerror 2010-05-23 18:48:35

+0

我刚刚使用了数组(1,2)作为示例,在项目中它是一个关联数组,因此可以工作。 – tstenner 2010-05-23 18:48:44

+0

不能在静态上下文中使用'this'。尝试静态/自我。 – webbiedave 2010-05-23 18:50:29

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 
) 
+0

也是一个很好的答案,但是每次我想要访问它们并且如果从B继承应该继承时,数组将被合并,'getArr()'必须调用'parent :: getArr()',而不是'parent :: $ arr'。 – tstenner 2010-05-23 18:52:29

+0

是。无论如何,我不认为继承和静态属性有很大的意义。无论什么作品虽然。 – typeoneerror 2010-05-23 19:51:06