gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:46:29 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com