php - 我可以在类方法中使用 static 关键字吗?它有什么后果?

标签 php oop

class Foo {

  private $items;

public function getItems() {
  static $loaded = FALSE;

  if (isset($this->items) && $loaded) {
     return $this->items;
  } else if ($loader = $this->getLoader()) {
    //logic for fetching items from other source;
    $this->loaded = TRUE;
  } else {
    $this->items = array();
  }

  return $this->items;
}

}

使用静态变量或更好地引入类属性是否有效? $loaded 不是为每个类实例共享吗? (例如:类静态变量)?

最佳答案

两者都是可能的(在方法中使用静态变量并使用私有(private)静态类属性)。

静态变量与静态类属性有何不同?

  1. 在到达 static $loaded = FALSE; 行之前,静态变量不会被实例化。在下面的示例中,当您第一次调用 getItems() 时,您将收到“ undefined variable :已加载”错误:

    function getItems()
    {
        var_dump($loaded);
        static $loaded = 1;
    }
    
  2. 静态变量仅存在于当前函数/方法的范围内,因此无法从其他方法读取或写入它,甚至子类的 getItems 也无法读取或写入它。在下面的示例中,您还将收到“ undefined variable :已加载”错误:

    class Foo
    {
        public function getItems()
        {
            static $loaded = 1;
        }
    }
    class Bar extends Foo
    {
        public function getItems()
        {
            parent::getItems();
            var_dump($loaded);
        }
    }
    (new Bar)->getItems();
    

TL;DR:它基本上只是另一个局部变量,只不过它在对同一方法的后续调用中保留其值(独立于对象!)


另一个例子来证明变量独立于实际对象:

class Foo
{
    public function getItems()
    {
        static $loaded = 1;
        $loaded++;
        var_dump($loaded);
    }
}
$foo1 = new Foo;
$foo2 = new Foo;
$foo1->getItems();
$foo2->getItems();

输出:

int(2)
int(3)

关于php - 我可以在类方法中使用 static 关键字吗?它有什么后果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33850268/

相关文章:

php - 使用 jQuery 在 Codeigniter 中使用 Ajax

python - 从静态方法访问静态变量

javascript - 更好的方法来处理 JavaScript 类中的状态变化

javascript - 通过特定属性计算对象数组的总和返回 NaN

php - idn_to_ascii() : INTL_IDNA_VARIANT_2003 is deprecated

php - mysql查询的问题

php - 将动态创建的表单字段中的数据放入 MySQL 数据库中

php - 使用 CodeIgniter 上传文件

Java - 如何在创建数据实例时停止编辑数据

c++ - 我如何处理行为的组合?