【发布时间】:2016-02-11 08:26:40
【问题描述】:
我正在尝试理解抽象类中的静态属性行为。这是从php 对象模式和实践书(第 11 章-装饰模式)检索到的示例代码:
abstract class Expression {
private static $keycount=0;
private $key;
function getKey() {
if ( ! isset( $this->key ) ) {
self::$keycount++;
$this->key=self::$keycount;
}
return $this->key;
}
}
从这个抽象类扩展了许多子类,然后getKey()方法将在实例化时被调用。每个子类检查自己的$key属性,如果它为null,则将$keycount加一并赋值它到$key 属性。
据我了解$keycount 保存它的最后一个值,不管它在哪个子类上运行。我的意思是它在抽象类的上下文中,而不是在子类的上下文中。如果它依赖于它的子类,那么它将在每个子类中重置为0。任何人都可以让我对此有更多的了解吗?
【问题讨论】:
-
如果您希望将其作为每个子类的计数,则在您希望单独计数的每个子类中定义
protected static $keycount=0;和protected $key;,并将self::$keycount++; $this->key=self::$keycount;更改为static::$keycount++; $this->key=static::$keycount; -
请记住,
Expression::$keycount变量只有一个实例。这就是static所暗示的。它适用于_Expression的任何实例。因此,每当从任何实例调用getKey()方法时,它可能会更新唯一一个Expression::$keycount变量。注意:每个实例都有自己的 $key 局部变量。 -
@RyanVincent 谢谢。您的评论可能是最好的答案