OCD*_*Dev 10 php oop late-static-binding php-5.3
看看这个例子,注意输出指示.
<?php
class Mommy
{
protected static $_data = "Mommy Data";
public static function init( $data )
{
static::$_data = $data;
}
public static function showData()
{
echo static::$_data . "<br>";
}
}
class Brother extends Mommy
{
}
class Sister extends Mommy
{
}
Brother::init( "Brother Data" );
Sister::init( "Sister Data" );
Brother::showData(); // Outputs: Sister Data
Sister::showData(); // Outputs: Sister Data
?>
Run Code Online (Sandbox Code Playgroud)
我的理解是使用static关键字将引用子类,但显然它只是在子类中缺少父类时神奇地应用于父类.(这对PHP来说是一种危险的行为,更多内容将在下面解释.)
我有以下两点要记住我为什么要这样做:
但是,如果我们想要在运行时覆盖属性(通过init方法),它将为父类重写它!从那时起,早期初始化的子课程(如兄弟的情况)意外地改变了你.
显然,这是子类没有自己的静态属性副本的结果,只要它没有在子类内部显式定义 - 而不是抛出错误,它会切换静态行为以访问父类.因此,是否存在某种方式,父类可以动态创建属于子类的属性,而不会出现在子类定义中?这样子类可以有自己的静态属性副本,静态关键字可以正确引用它,并且可以编写它以考虑父属性默认值.
还是有其他解决方案,好的,坏的还是丑的?
它确实引用了正确的类,只是,除非重新声明或引用集被破坏,否则子类中的静态属性与超类中的引用集相同。
所以你必须这样做:
class Brother extends Mommy
{
protected static $_data;
}
Run Code Online (Sandbox Code Playgroud)
或者:
class Brother extends Mommy
{
}
$tmp = null;
Brother::$_data =& $tmp;
unset($tmp);
Run Code Online (Sandbox Code Playgroud)