【问题标题】:Re-Initializing static members in PHP在 PHP 中重新初始化静态成员
【发布时间】:2011-11-17 16:14:55
【问题描述】:

我今天的考试中有一个问题,我必须确定输出。

<?php
function statfun($x)
{
    static $count=0;

    $count += $x;

    if ($count < 20) {
        echo "$count <br>";
        statfun(++$x);
    } else {
        echo "last num is $count";
    }
}

statfun(2);
?>

输出是

2
5
9
14
last num is 20

我不知道为什么这是输出。我知道这是由于静态成员,但每次进入函数时,成员 $count 都会重新初始化。我在 Static Keyword 看到了文档。

但是关于静态变量的重新初始化没有写吗?我们可以在 PHP 中重新初始化静态变量吗?具有相同或任何其他值?

【问题讨论】:

  • 我不知道为什么这是输出。我知道这是由于静态成员 ...我很困惑,那你想知道什么?类中的 static 关键字有所不同。看看variable scope
  • 我不关注。你能详细说明“重新初始化php中的静态变量”是什么意思吗?
  • 我的意思是这个输出是由于静态成员。如果我们从中删除静态词,输出将完全不同
  • @Tadeck 我们一次又一次地调用该函数 statfunc()。每当我们调用该函数时,静态成员是否会重新初始化?
  • 不,如果它们被初始化一次,它们就不会再次被初始化——这就是函数中静态变量的工作方式。它们存储分配给它们的值,即使分配发生在同一函数的不同调用中。

标签: php static


【解决方案1】:

每次进入函数时,成员 $count 都会重新初始化

这是不正确的。静态变量仅被初始化一次,这就是静态声明的变量与“普通”变量的不同之处。所以基本上,您正在为$count 分配一个初始值。在多次调用statfun() 时,此静态变量的值会被保留并可重复使用。

来自the manual,“使用静态变量”部分:

静态变量只存在于局部函数作用域内,但当程序执行离开该作用域时它不会失去其值。

还可以查看手册中的示例代码。那里所说的差异应该可以回答您的问题。

【讨论】:

  • 但为什么它不会像在 java 或 c++ 中重新声明变量那样给出错误。它不能忽略行 static $count=0;
  • ...因为它没有重新声明。
  • @Sharpzain120 你错了。在 C++ 中,函数中的 static 关键字与 PHP 中的效果完全相同:它阻止了变量的重新初始化。
  • @Linus @ Aillyn 在每次函数调用时解释 $count=0 行时,“PHP 编译器”会做什么?
  • @Sharpzain120 在 Java 中,没有可言的函数,也不能在方法中将变量声明为 staticstatic Java 中的变量是类变量。它们的行为类似于 PHP 中类上下文中的 static 变量:php.net/manual/en/language.oop5.static.php
【解决方案2】:

当你通过 2 计数设置为 2 与$count+=$x; 然后你打电话给statfun(++$x),即$x+1,即2+1=3 所以现在 $count 将是 $count+3 即 5,然后您调用值为 3 的 statfun 然后 $count 将 $count+(3+1) = 9 依此类推

静态变量将保持其状态。所以如果你这样称呼它

所以基本上静态变量将保持它的值并且不会被重新初始化。

【讨论】:

  • 我知道流程,基本上我想问的是,每当我们进入函数静态 $count=0。这个语句将计数初始化为 0。为什么你使用以前的 $ 值数?
  • @Sharpzain120:因为static 关键字明确声明要保留以前的值。
  • @FelixKling 在每次函数调用时解释 $count=0 行时“PHP 编译器”会做什么?
  • 编译器将忽略静态 $count=0;顺便说一句,如果它已经在该方法中声明,并且编译器不会两次编译相同的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多