非静态方法中的静态在实例之间共享

Ann*_*rom 5 php

我遇到了一些意外的行为,在对象方法中定义的静态变量是跨实例共享的.这可能是已知的行为,但是当我浏览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

hob*_*ave 6

这是静态的定义.

如果希望成员特定于对象的实例,则使用类属性

例如

<?php

class Foo
{
    protected $_count = 0;
    public function doFoo()
    {
        echo $this->_count++, '<br>';
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:好的,我将文档链接到OOP静态属性.但这个概念是一样的.如果您阅读变量范围文档,您将看到:

注意:静态声明在编译时解析.

因此,当您的脚本编译时(在执行之前),静态是"设置"(不确定要使用的术语).无论您实例化多少个对象,当该函数"构建"时,静态变量引用与其他人相同的副本.