我遇到了一些意外的行为,在对象方法中定义的静态变量是跨实例共享的.这可能是已知的行为,但是当我浏览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
Run Code Online (Sandbox Code Playgroud)
现在,我希望每个实例$i都是静态的,但实际上是在实例之间共享.对于我自己的启发,有人可以详细说明为什么会这样,并在php.net上记录它的位置?$i
这是静态的定义.
如果希望成员特定于对象的实例,则使用类属性
例如
<?php
class Foo
{
protected $_count = 0;
public function doFoo()
{
echo $this->_count++, '<br>';
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:好的,我将文档链接到OOP静态属性.但这个概念是一样的.如果您阅读变量范围文档,您将看到:
注意:静态声明在编译时解析.
因此,当您的脚本编译时(在执行之前),静态是"设置"(不确定要使用的术语).无论您实例化多少个对象,当该函数"构建"时,静态变量引用与其他人相同的副本.
| 归档时间: |
|
| 查看次数: |
2185 次 |
| 最近记录: |