在没有实例化的情况下从超类访问子变量

时间:2009-02-03 23:27:49

标签: php oop static

我试图通过父类在没有实例化的情况下访问子类中的成员变量。

这是我的一次尝试,但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 个答案:

答案 0 :(得分:2)

您遇到的概念称为“延迟静态绑定”。在PHP 5.3.0之前,没有对此的支持。

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

  

静态公共函数getStatic(){

return static::$myStatic;
     

}

答案 1 :(得分:1)

其他正确,代码的方式无法完成,因为变量在编译时不存在。

这样做的方法通常是抽象类(PHP5及以上版本,看起来像)。

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

这种方法的警告是你不能实例化A,因为它是抽象的。你总是必须制作B或C(或其中的子类)。

您还可以在A中创建一个setter,并让子类使用它来设置值(而不是'=')。这将允许您实例化A,它可以设置值,如果它需要。您可能能够将setter设置为private,因此无法直接调用它,我不知道子类是否可以在PHP中使用私有函数。

答案 2 :(得分:0)

您在函数声明和变量之间存在不匹配。

您需要将函数声明移至B

将变量的声明移到A.

答案 3 :(得分:0)

B类继承A类的属性而不是相反的属性。

为什么不在示例中使用B::$myStatic

答案 4 :(得分:0)

您必须将myStatic移动到A. A中的方法getStatic无法访问A中不存在的变量。

答案 5 :(得分:0)

来自PHP manual

  

对当前类的静态引用   像self::__CLASS__已解决   使用其中的函数类   属于,如在其定义的地方:

因为该方法是在A中定义的,当您在getStatic()B上调用C时,它会尝试返回不存在的a::$myStatic。即使它确实存在,你也只能获得该值,而不是子类中任何被覆盖的值。

解决方案是Late Static Bindings,但这只适用于尚未发布的PHP 5.3。

答案 6 :(得分:-1)

必须在A类中将

$myStatic声明为静态:请参阅here

答案 7 :(得分:-1)

class A {
    public static $myStatic = 5;
}    
class B extends A {
    public static $myStatic = 3;
}
class C extends A {
    public static $myStatic = 1;
}

然后只使用B :: $ myStatic ...