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

有没有办法让PHP子类继承属性(静态和实例)?,php,inheritance,late-static-binding,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"; }

如果我声明一个基类,如下所示:

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的后期静态绑定和继承是否允许这种情况。我已经在尝试解决这个问题了……但是,一个未声明的静态属性会依赖它的父属性来获取一个值,这似乎没有什么意义

继承和
静态
属性有时会导致PHP中出现“奇怪”的事情

您应该看看PHP手册:它解释了在PHP=5.3中继承和使用
static
属性时会发生什么,您可以使用
static::
关键字而不是
self::
,这样静态绑定在执行(而不是编译)时完成。

答案是“有一个变通方法”


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

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

  • 静态属性将始终使用相同的内存引用,就像静态变量一样()
  • 相同的引用在类和子类之间共享()
  • 它在中似乎很有用,所以它不是一个“完整”bug,只是未记录的行为。如果它得到了“修复”,那么它将导致与以前工作的代码的兼容性问题(向后兼容性中断)
  • 不过,还有两个问题:

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

    我创建了以下PHP错误报告:我鼓励人们去查看并给予支持。这是一个相当严格的限制。目前的行为也完全没有意义。人们似乎已经屈服于不直观的默认行为。这里的问题要么是PHP的默认行为不正确,要么是需要一种动态声明属性的方法。我完全支持您的请求,这种行为非常烦人!不幸的是,它似乎停留在这里。我已经在我的示例中使用了后期静态绑定。。。我知道这是什么。遗憾的是,这是我不久前在blogspot上写的博客。我很抱歉。解决方法是创建一个静态构造函数,手动复制属性并调用它。这并不能解决问题的实际情况:在静态上下文中使用。