首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP继承和LSB问题

PHP继承和LSB问题
EN

Stack Overflow用户
提问于 2013-08-08 17:21:10
回答 1查看 105关注 0票数 0

我有以下问题:

代码语言:javascript
复制
<?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()来打招呼。我预计产出如下:

代码语言:javascript
复制
Setting C1::_greetings to Hello World!
Setting C2::_greetings to Ola Chica!
C1 says Hello World!
C2 says Ola Chica!
Hello World!
Ola Chica!

但我得到的是:

代码语言:javascript
复制
Setting C1::_greetings to Hello World!
Setting C2::_greetings to Ola Chica!
C1 says Ola Chica!
C2 says Ola Chica!
Ola Chica!
Ola Chica!

我想知道为什么.!?提前感谢那些愿意花时间理解问题的人:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

在我的小例子中,问题来自这样一个事实:除非另有规定(见下面的说明),静态变量的存储对于“家庭”类(即母亲和所有子类)是相同的。要确保每个类都有自己的存储空间,只需在子类中重新声明相同的静态变量,如下所示:

代码语言:javascript
复制
/**
 * 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(); }
}

将其返回到前面的示例中,输出与预期的完全相同:

代码语言:javascript
复制
Setting C1::_greetings to Hello World!
Setting C2::_greetings to Ola Chica!
C1 says Hello World!
C2 says Ola Chica!
Hello World!
Ola Chica!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18132151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档