我有以下问题:
<?php
/**
* Mother class defining static methods/attribute
*/
class A
{
public static $_greetings = 'Nothing';
public static function hi()
{
$c = get_called_class();
echo $c.' says '.$c::$_greetings.PHP_EOL;
}
public static function set($classname)
{
$c = get_called_class();
$g = $classname::$_greetings;
echo 'Setting '.$c.'::_greetings to '.$g.PHP_EOL;
$c::$_greetings = $g;
}
}
/**
* Children using inherited static method
*/
class C1 extends A
{
public function say() { self::hi(); }
}
class C2 extends A
{
public function say() { self::hi(); }
}
/**
* Data containers
*/
class D1
{
public static $_greetings = 'Hello World!';
}
class D2
{
public static $_greetings = 'Ola Chica!';
}
// ------------------------------------------------------------------------
/**
* The great misunderstanding...
*/
C1::set( 'D1' );
C2::set( 'D2' );
$c1 = new C1();
$c2 = new C2();
$c1->say();
$c2->say();
echo C1::$_greetings.PHP_EOL;
echo C2::$_greetings.PHP_EOL;简单地说,A定义了一个打印静态消息$_greetings的方法。此消息将使用A::set( classname )进行设置,这将输入包含静态参数$_greetings的类的名称。然后是两个子程序,它们定义了自己的方法say(),使用继承的静态hi()来打招呼。我预计产出如下:
Setting C1::_greetings to Hello World!
Setting C2::_greetings to Ola Chica!
C1 says Hello World!
C2 says Ola Chica!
Hello World!
Ola Chica!但我得到的是:
Setting C1::_greetings to Hello World!
Setting C2::_greetings to Ola Chica!
C1 says Ola Chica!
C2 says Ola Chica!
Ola Chica!
Ola Chica!我想知道为什么.!?提前感谢那些愿意花时间理解问题的人:)
发布于 2013-08-08 22:09:39
我可以在这里找到答案,尽管问题的措辞不一样:PHP 5.3: Late static binding doesn't work for properties when defined in parent class while missing in child class
在我的小例子中,问题来自这样一个事实:除非另有规定(见下面的说明),静态变量的存储对于“家庭”类(即母亲和所有子类)是相同的。要确保每个类都有自己的存储空间,只需在子类中重新声明相同的静态变量,如下所示:
/**
* Children using inherited static method
*/
class C1 extends A
{
public static $_greetings;
public function say() { self::hi(); }
}
class C2 extends A
{
public static $_greetings;
public function say() { self::hi(); }
}将其返回到前面的示例中,输出与预期的完全相同:
Setting C1::_greetings to Hello World!
Setting C2::_greetings to Ola Chica!
C1 says Hello World!
C2 says Ola Chica!
Hello World!
Ola Chica!https://stackoverflow.com/questions/18132151
复制相似问题