【问题标题】:PHP static property behaviorPHP 静态属性行为
【发布时间】: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 谢谢。您的评论可能是最好的答案

标签: php oop static abstract


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2018-04-18
    • 1970-01-01
    • 2014-02-18
    • 2013-03-28
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多