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

标签 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

现在,我希望 $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/

相关文章:

PHP PDO 按列分组结果

php - PDO 透视表

php - 读取和写入cookie

php - shell_exec() 的输出包含重音字符被破坏

php - 如何使用 Drupal `db_select()` 方法转换查询?

php - 在文本中保存光标高亮位置

PHP iconv 错误

php - Zend Framework Composer 自动加载

php - 为什么这段访问 MySQL 数据库的 PHP 代码不起作用?

php - 遍历多维数组