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

在不声明的情况下从超级类访问子变量

  •  1
  • gak  · 技术社区  · 16 年前

    我试图通过父类访问子类中的成员变量而不进行实例化。

    这是我的一次尝试,但是 B::getStatic() 失败了 Access to undeclared static property .

    有没有其他的解决方案,可能没有静态的?

    class A {
    
        static public function getStatic() {
    
            return self::$myStatic;
    
        }
    
    }
    
    class B extends A {
    
        public static $myStatic = 5;
    
    }
    
    class C extends A {
    
        public static $myStatic = 6;
    
    }
    
    var_dump(B::$myStatic);
    var_dump(B::getStatic());
    
    var_dump(C::$myStatic);
    var_dump(C::getStatic());
    
    8 回复  |  直到 13 年前
        1
  •  2
  •   Shane H    16 年前

    您遇到的概念称为“后期静态绑定”。在php 5.3.0之前,不支持这种方法。

    如果运行的是5.3.0或更高版本,请更新getstatic()方法:

    静态公共函数getStatic()。{

    return static::$myStatic;
    

    }

        2
  •  1
  •   MBCook    16 年前

    其他的都是对的,因为变量在编译时不存在,所以您的代码是无法完成的。

    这样做的方法通常是使用一个抽象类(在php5和更高版本中可用,看起来是这样)。

    类A将是抽象类,并具有getStatic()函数。类B和类C将扩展A并为getstatic()函数定义。这样,当调用getstatic()时,您将得到子类定义的值,因为在a中没有定义。

    这种方法的警告是,您不能实例化,因为它是抽象的。你总是需要做一个b或者c(或者其中的一个子类)。

    您还可以在中创建一个setter,并让子类使用它来设置值(而不是“=”。这将允许您实例化一个,如果需要,它可以设置值。您可以将setter设置为私有的,这样就不能直接调用它,我不知道子类是否可以在PHP中使用私有函数。

        3
  •  0
  •   cbrulak    16 年前

    函数和变量的声明不匹配。

    您需要将函数的声明移到b

    将变量的声明移动到a。

        4
  •  0
  •   Gumbo    16 年前

    类B从类A继承属性,而不是反向继承。

    为什么不使用 B::$myStatic 比如你的例子?

        5
  •  0
  •   psycho    16 年前

    必须将mystatic移到a中。方法getstatic在a中无法访问不存在于a中的变量。

        6
  •  0
  •   NullUserException Mark Roddy    13 年前

    PHP manual :

    对当前类的静态引用 喜欢 self:: __CLASS__ 被解决 使用函数所在的类 属于,如其定义所示:

    因此,当您调用 getStatic() B C 它正试图返回 a::$myStatic 不存在。即使它确实存在,您也只能返回该值,而不是子类中的任何重写值。

    解决方案是后期的静态绑定,但这仅在尚未发布的PHP5.3中可用。

        7
  •  -1
  •   mdm    16 年前

    $myStatic 必须在类A中声明为静态:请参见 here .

        8
  •  -1
  •   Luca Matteis    16 年前
    class A {
        public static $myStatic = 5;
    }    
    class B extends A {
        public static $myStatic = 3;
    }
    class C extends A {
        public static $myStatic = 1;
    }
    

    然后用b::$mystatic…

    推荐文章