有没有办法让PHP子类继承属性(静态和实例)?

时间:2009-07-30 00:24:39

标签: php inheritance late-static-binding

如果我按如下方式声明基类:

abstract class Parent {

  protected static $message = "UNTOUCHED";

     public static function yeah() {
         static::$message = "YEAH";
     }
     public static function nope() {
         static::$message = "NOPE";
     }

     public static function lateStaticDebug() {
         return(static::$message);
     }

}

然后扩展它:

class Child extends Parent {
}

然后执行此操作:

Parent::yeah();
Parent::lateStaticDebug();  // "YEAH"

Child::nope();
Child::lateStaticDebug();  // "NOPE"

Parent::yeah();
Child::lateStaticDebug()   // "YEAH"

有没有办法让我的第二个类从第一个继承属性而不仅仅是方法?

我只是想知道是否有关于PHP的后期静态绑定以及允许这种情况的继承。我已经习惯了这个问题...但是,一个未声明的静态属性会回落到它的父级值上似乎没有意义吗?

3 个答案:

答案 0 :(得分:1)

继承和static属性有时会导致PHP中的“奇怪”事情。

您应该查看PHP手册中的Late Static Bindings:它解释了在PHP中继承和使用static属性时可能发生的情况< = 5.2;并为PHP> = 5.3提供了解决方案,您可以使用static::关键字而不是self::,以便在执行(而不是编译)时完成静态绑定。

答案 1 :(得分:-1)

对于那些最终想知道“WTF PHP”的人来说,这种行为似乎有几个原因以及为什么保留它,尽管很奇怪:

  1. 静态属性将始终使用相同的内存引用,就像静态变量一样 (mentioned in the bug the OP raised)
  2. 在类和子类之间共享相同的引用 (explained in a duplicated bug)
  3. 它似乎在 some other contexts 中很有用,因此它不是“完整”错误,只是未记录的行为。如果它得到“修复”,则会导致与以前工作代码的兼容性问题(向后兼容性中断)。

还有两个问题:

  • 为什么后期静态绑定不会改变这一点:可能与 #1 相关
  • 为什么我们看到的这个缺点没有在文档页面中解释......嗯,那是 PHP,对吧?

答案 2 :(得分:-2)

答案是“解决方法”。

您必须创建一个静态构造函数并调用它来复制属性。