4

如果我声明一个基类如下:

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 的后期静态绑定以及允许这样做的继承。我已经在解决这个问题了……但是,未声明的静态属性会退回到其父级以获取值似乎没有意义!?

4

3 回答 3

0

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

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

于 2009-07-30T04:53:04.153 回答
-1

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

  1. 静态属性将始终使用相同的内存引用,就像静态变量一样(在 OP 提出的错误中提到
  2. 在类和子类之间共享相同的引用(在重复的错误中解释
  3. 它似乎在其他一些情况下很有用,所以它不是一个“完整的”错误,只是未记录的行为。如果它得到“修复”,则会导致与以前工作代码的兼容性问题(向后兼容中断)。

不过还有两个问题:

  • 为什么后期静态绑定不会改变这一点:可能与#1有关
  • 为什么我们看到的那个缺点没有在文档页面中解释……嗯,那是PHP,对吧?
于 2021-06-05T02:55:00.987 回答
-3

答案是“有解决方法”。

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

于 2009-08-07T16:31:50.003 回答