PHP静态属性行为

时间:2016-02-11 08:26:41

标签: php oop static abstract

我正在尝试理解抽象类中的静态属性行为。这是从 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。任何人都能让我更深入地了解它吗?

1 个答案:

答案 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