我遇到了一些意想不到的行为,在对象方法内部定义的静态变量在实例间共享。这可能是已知行为,但是当我浏览 PHP 文档时,我无法在对象方法中找到静态定义变量的实例。
这是我遇到的行为的缩减:
<?php
class Foo {
public function dofoo() {
static $i = 0;
echo $i++ . '<br>';
}
}
$f = new Foo;
$g = new Foo;
$f->dofoo(); // expected 0, got 0
$f->dofoo(); // expected 1, got 1
$f->dofoo(); // expected 2, got 2
$g->dofoo(); // expected 0, got 3
$g->dofoo(); // expected 1, got 4
$g->dofoo(); // expected 2, got 5
现在,我希望 $i
每个实例 是静态的,但实际上 $i
是在实例之间共享的。对于我自己的启发,有人可以详细说明为什么会这样,以及它在 php.net 上的哪个位置记录?
最佳答案
这是 very definition静电。
如果您希望成员特定于某个对象的实例,那么您可以使用 class properties
例如
<?php
class Foo
{
protected $_count = 0;
public function doFoo()
{
echo $this->_count++, '<br>';
}
}
编辑: 好的,我将文档链接到 OOP 静态属性。虽然概念是一样的。如果您阅读 variable scope您将看到的文档:
Note: Static declarations are resolved in compile-time.
因此当你的脚本被编译时(在它执行之前)静态是“设置”(不确定使用什么术语)。无论您实例化多少个对象,当该函数被“构建”时,静态变量引用与其他人相同的副本。
关于php - 非静态方法中的静态在实例之间共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321406/