2

我正在尝试用 PHP 编写以下代码

class A {
 protected static $comment = "I am A" ;
 public static function getComment () {
  return self :: $comment; 
 }
}

class B extends A {
 protected static $comment = "I am B" ;
}

echo B::getComment () ; // echoes "I am A"

它不应该返回I am B吗?在oop PHP中,孩子不会覆盖父母吗?谢谢你的澄清。

== 编辑 ==

另外我的问题是静态和实例之间有什么区别,因为在实例中它可以工作:

class A {
    protected $comment = "I am A" ;

    public function getComment () {
        return $this -> comment ;
    }
}

class B extends A {
    protected $comment = "I am B" ;
}

$B=new B ;

echo $B->getComment();
4

3 回答 3

3

您正在寻找的功能称为“后期静态绑定”,并在此处记录

简短的版本是,为了让静态变量按照您希望的方式工作,您需要使用static::而不是self::.

注意:这只适用于 PHP 5.3 及更高版本。

于 2013-02-28T11:50:03.803 回答
1

是的,它会覆盖它,但在你的情况下,你没有getComment覆盖parent class.

如果你试试

class B extends A {
 protected static $comment = "I am B" ;
 public static function getComment () {
  return self :: $comment; 
 }
}

然后它会显示I am B

实际上,您正在做的是调用不存在的getComment方法,因此它会冒泡到方法并显示结果。b classchild classparent class

于 2013-02-28T11:49:09.120 回答
0

您需要使用 LATE STATIC BINDING

class A {
 protected static $comment = "I am A" ;
 public static function getComment () {
  return static :: $comment; 
 }
}

class B extends A {
 protected static $comment = "I am B" ;
}

echo B::getComment () ; // echoes "I am A"

我希望这有点道理

于 2013-02-28T11:52:06.767 回答