<?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!
?>
那么什么是最好的解决方法?
答案 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
的值仅取决于实际实现该方法的类,而不取决于调用它的类。