我正在尝试理解抽象类中的静态属性行为。这是从 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,则增加{{1一个并将其分配给$keycount
属性
据我所知$key
保存它的最后一个值,无论它运行在哪个子类上。我的意思是它是在抽象类的上下文中而不是子类的上下文。如果它依赖于它的子类,那么它将被重置为每个子类中的$keycount
。任何人都能让我更深入地了解它吗?
答案 0 :(得分:1)
看起来你回答了自己的问题。
据我了解$ keycount保存其最后一个值,无论它在哪个子类上运行
是的,它以这种方式运作。 $keycount
在所有子类之间共享。
这是一个检查此行为的简单测试:
<?php
abstract class Expression {
private static $keycount=0;
private $key;
function getKey() {
if ( ! isset( $this->key ) ) {
self::$keycount++;
$this->key=self::$keycount;
}
return $this->key;
}
}
class ChildOne extends Expression {
}
class ChildTwo extends Expression {
}
$one = new ChildOne();
print 'One get key: ' . $one->getKey().PHP_EOL;
print 'One get key: ' . $one->getKey().PHP_EOL;
$oneMore = new ChildOne();
print 'One more get key: ' . $oneMore->getKey().PHP_EOL;
print 'One more get key: ' . $oneMore->getKey().PHP_EOL;
$two = new ChildTwo();
print 'Two get key: ' . $two->getKey().PHP_EOL;
print 'Two get key: ' . $two->getKey().PHP_EOL;
输出:
One get key: 1
One get key: 1
One more get key: 2
One more get key: 2
Two get key: 3
Two get key: 3