2009-02-03 60 views
1

我试图通过没有实例化的父类访问子类中的成员变量。从没有实例的超类访问子变量

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

没有你试着将A的躁动看成某种价值,看看会出现什么? – cbrulak 2009-02-03 23:30:57

+0

是的。它引用A中的静态,只是不在B中。我明白为什么这是一个问题,因为A可能无法识别B的静态。我问是否有另一种方式来做到这一点? – 2009-02-03 23:34:23

+0

哈哈大家都被压低了! – 2009-02-03 23:49:09

回答

2

您遇到的概念称为“后期静态绑定”。在PHP 5.3.0之前,并没有对此提供支持。

如果你正在运行5.3.0或更高,更新getStatic()方法:

静态公共功能getStatic(){

return static::$myStatic; 

}

-1

$myStatic必须声明A类静态:见here

0

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

要么你需要移动函数的声明到B

动议变量的声明到A.

0

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

为什么你不使用B::$myStatic就像你的例子?

-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 ...

0

你必须myStatic进入A.你的方法getStatic在A不能访问不答

存在的变量
0

PHP manual:当前类 像self::__CLASS__

静态引用解析 我们荷兰国际集团在该函数 所属的类,在它被定义为:

所以,因为该方法是在,当你在BC调用它getStatic()定义试图返回a::$myStatic,这没有按”不存在。即使它确实存在,你也只能得到这个值,而不是子类中的任何重载值。

一个解决方案是延迟静态绑定,但只有PHP 5.3尚未发布。

1

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

做这样的事情的方式通常是抽象类(PHP5中可用,看起来像)。

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

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

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