gpt4 book ai didi

对象成员函数中的 PHP 和静态变量

转载 作者:IT王子 更新时间:2023-10-29 00:18:06 29 4
gpt4 key购买 nike

直到今天,我认为我对静态修饰符的工作原理有了相当好的理解。我知道(用外行的话来说)函数中的静态变量不会在调用该函数时“重置”,而且我知道类上的静态变量和函数可以通过类本身调用它们来访问(不是实例化)类)。

我的问题是:今天我发现,如果我在一个类的非静态函数的内部声明一个静态变量,该类的所有实例都共享单独调用成员函数时的静态变量。

例如:

class A {
public function GetValue() {
static $value = 0;
$value++;
return $value;
}
}

$instance_1 = new A();
$instance_2 = new A();
echo $instance_1->GetValue();
echo $instance_1->GetValue();

echo $instance_2->GetValue();
echo $instance_2->GetValue();

echo $instance_1->GetValue();
echo $instance_1->GetValue();

请注意,GetValue 函数既未声明为静态函数也未以静态方式使用(如在类本身上调用)。

现在,我一直假设这会输出:121234

相反,我发现它会输出:123456

就像我说的,如果静态变量 $value 在静态函数中,我会理解这一点。但是,由于它位于非静态函数内部,我只是假设它只会“绑定(bind)”到每个单独实例化“内部”的函数。

我想我的问题是双重的,那么... 1) 这是错误还是预期的行为? 2) 其他语言是否以相同的方式处理这些“非静态内部的静态”变量,或者这是 PHP 独有的?

最佳答案

  1. 这是预期的。
  2. 在 C++ 中也是如此(也可能在其他语言中也是如此)。

您应该将非静态类成员函数视为就像普通函数一样,但具有由解释器自动提供的隐式 $this 参数。 (这正是它们在大多数语言中的实现方式。)

关于对象成员函数中的 PHP 和静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6601027/

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