我试图通过父类在没有实例化的情况下访问子类中的成员变量。
这是我的一次尝试,但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());
答案 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)
$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 ...