在PHP中覆盖派生类中的静态成员

时间:2010-07-03 01:45:56

标签: php inheritance static

<?php
class Base {
  protected static $c = 'base';

  public static function getC() {
    return self::$c;
  }
}

class Derived extends Base {
  protected static $c = 'derived';
}

echo Base::getC(); // output "base"
echo Derived::getC();    // output "base", but I need "derived" here!
?>

那么什么是最好的解决方法?

3 个答案:

答案 0 :(得分:9)

解决此问题的最佳方法是升级到PHP 5.3,其中late static bindings可用。如果那不是一个选项,那么你很遗憾不得不重新设计你的课程。

答案 1 :(得分:4)

基于deceze和Undolog的输入: 对于PHP&lt; = 5.2,Undolog是对的。

但是使用5.3和后期静态绑定它将起作用,只需在函数内使用static而不是self - 现在它将起作用... // THX @ deceze for the hour

我们复制过去的样本扫描stackoverflow用户 - 这将起作用:

class Base {
  protected static $c = 'base';
  public static function getC() {
    return static::$c; // !! please notice the STATIC instead of SELF !!
  }
}

class Derived extends Base {
  protected static $c = 'derived';
}

echo Base::getC();      // output "base"
echo Derived::getC();   // output "derived"

答案 2 :(得分:0)

你必须重新实施基类方法;试试:

class Derived extends Base {
  protected static $c = 'derived';

  public static function getC() {
    return self::$c;
  }
}

如您所见,此解决方案非常无用,因为强制重写所有子类化方法。

self::$c的值仅取决于实际实现该方法的类,而不取决于调用它的类。