Aro*_*ron 12 php oop static parent-child
包含问题的快速代码:
abstract class ClassParent {
public static $var1 = "ClassParent";
}
class ClassChild1 extends ClassParent{
public static function setvar1(){
ClassChild1::$var1 = "ClassChild1";
}
}
class ClassChild2 extends ClassParent{
public static function setvar1(){
ClassChild2::$var1 = "ClassChild2";
}
}
ClassChild1::setvar1();
echo ClassChild2::$var1;
// Returns "ClassChild1". Shouldn't this still be "ClassParent"?
Run Code Online (Sandbox Code Playgroud)
我假设上面是预期的行为而不是PHP错误.在这种情况下,我怎么能在父类中声明一个静态变量,它将为子类单独处理.换句话说,我想要具有单独的静态值PER CHILD CLASS.我必须在子类中具体声明静态变量,还是可能有另一种方式?
谢谢!
Lau*_*ren 16
编辑:进一步调查,我认为你所要求的是不可能的,即使是后期的静态绑定.实际上,我有点惊讶.
这个问题的答案提供了一些解决方法.
原始答案:
在父类中,如果您在表单中引用静态变量:
self::$var
Run Code Online (Sandbox Code Playgroud)
它将在所有继承的类中使用相同的变量(因此所有子类仍将访问父类中的变量).
这是因为self关键字的绑定是在编译时完成的,而不是在运行时完成的.
从PHP 5.3开始,PHP支持使用static关键字进行后期静态绑定.因此,在您的类中,请参考变量:
static::$var
Run Code Online (Sandbox Code Playgroud)
并且'static'将在运行时解析为子类,因此每个子类都有一个单独的静态变量.
感谢您提出这个问题!我遇到了一些无法跟踪的问题,这帮助我解决了它们。:)
您可能有兴趣了解此行为的错误报告,其中包括解决方法。在你的情况下,这将是:
class ClassChild1 extends ClassParent{
public static function setvar1(){
$tmp = 'x';
static::$var1 =& $tmp; // break reference
// and now this works as expected: (changes only ClassChild1::$var1)
static::$var1 = "ClassChild1";
}
}
// do the same in ClassChild2...
Run Code Online (Sandbox Code Playgroud)
丑陋得要命,我同意——但是 PHP 以这种方式按预期工作,而且它没有副作用。
在我看来,这确实是一个非常可疑(且记录不足)的“功能” - 希望他们有一天能改变它。