【发布时间】:2011-02-20 19:43:41
【问题描述】:
如果我有一个包含静态var的基类,然后我设置这个静态var,然后有一个扩展基类的类,扩展类是否会保留我已经设置的静态var的值基类?
【问题讨论】:
标签: php static extending-classes
如果我有一个包含静态var的基类,然后我设置这个静态var,然后有一个扩展基类的类,扩展类是否会保留我已经设置的静态var的值基类?
【问题讨论】:
标签: php static extending-classes
是的,虽然它们是不同的变量,但两个类中的静态变量在同一个引用集中。
您可以通过使用引用分配 (=&) 或在扩展类中重新声明它来破坏此引用集:
class base {
public static $var;
}
class extended extends base {}
extended::$var = 8; // base::$var == 8
$t = 6;
extended::$var =& $t; // base::$var == 8; extended::$var == 6
class base {
public static $var;
}
class extended extends base {
public static $var;
}
extended::$var = 8; // base::$var == null; extended::$var == 8
【讨论】:
$var 属性不是静态的,但您将它们作为静态引用。继承的静态属性与其子类共享。
$var 的引用之前,变量是链接的。每个子类是否都在内部复制其父类的静态变量声明,并将每个子类设置为对匹配父变量的引用?
ReflectionProperty 将父级显示为类,因此在我看来它就像一个符号。但是,这并不意味着正如您的示例所展示的那样,这就是幕后发生的事情。 ;)$a和$b的情况比较明显;显然涉及两个符号。
$t 引用分配给$var 之后,反射仍将base 显示为$var 在extended 内的类。