代码之家  ›  专栏  ›  技术社区  ›  tstenner

扩展静态成员数组

  •  2
  • tstenner  · 技术社区  · 15 年前

    我有以下情况:

    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) 不起作用,但我认为应该可以这样做。

    2 回复  |  直到 9 年前
        1
  •  5
  •   Chris    15 年前

    您是正确的,在声明静态变量时只能分配文本和常量。解决方法是在声明类之后在代码中分配值。在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) 这取决于你把它们联合起来的顺序。

        2
  •  1
  •   typeoneerror    15 年前

    是的,您只需要稍微花哨一点,因为您将无法定义静态变量。

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