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)静态类属性)。
静态变量与静态类属性有何不同?
在到达
static $loaded = FALSE;
行之前,静态变量不会被实例化。在下面的示例中,当您第一次调用 getItems() 时,您将收到“ undefined variable :已加载”错误:function getItems() { var_dump($loaded); static $loaded = 1; }
静态变量仅存在于当前函数/方法的范围内,因此无法从其他方法读取或写入它,甚至子类的
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/