PHP静态变量

时间:2009-10-29 08:44:36

标签: php static

$count = 5;
function get_count()
{
    static $count = 0;
    return $count++;
}
echo $count;
++$count;
echo get_count();
echo get_count();

我猜测它输出5 0 1并且它是正确的,但我需要更好的解释?

6 个答案:

答案 0 :(得分:71)

函数中的变量$count与全局$count变量没有任何关系。 static keyword与C或Java中的相同,它意味着:只初始化此变量一次,并在函数结束时保持其状态。这意味着,当执行重新进入函数时,它会看到内部$ count已经初始化并最后一次存储为1,并使用该值。

答案 1 :(得分:41)

$count = 5; // "outer" count = 5

function get_count()
{
    static $count = 0; // "inner" count = 0 only the first run
    return $count++; // "inner" count + 1
}

echo $count; // "outer" count is still 5 
++$count; // "outer" count is now 6 (but you never echoed it)

echo get_count(); // "inner" count is now + 1 = 1 (0 before the echo)
echo get_count(); // "inner" count is now + 1 = 2 (1 before the echo)
echo get_count(); // "inner" count is now + 1 = 3 (2 before the echo)

我希望这会让你大开眼界。

答案 2 :(得分:13)

您有两个单独的变量,都称为$ count,但它们具有不同的scope。 第一个变量未显式声明,但在您第一次赋值时就已存在。

第二个变量(在方法内)仅对该方法可见。由于它是static,因此在同一方法的多次执行之间保留其值。赋值$count = 0;仅在方法第一次运行时执行。

对于递增运算符(++),评估的结果是之前的值递增,因为(unary)运算符位于变量名之后。所以是的,输出将是5,0,1 如果您要写return ++$count;,结果将是5,1,2。

注意:您现有代码中的++$count实际上等同于$count++,因为评估结果将被丢弃。对$count变量的影响是相同的:它增加1。

答案 3 :(得分:5)

First echo:给你在第一行声明的变量$ count。

第二个echo:calles get_count,它创建静态变量$ count(所以它在这个函数的上下文中),当你实例化静态变量时,你将它设置为零。 return $ count ++是我们通常在代码中避免的行之一 - 但实质上,它在返回值后递增。

第三个回声:同样,在前一次调用get_count之后0增加到1,这里发生的情况相同 - 它返回1并将值递增到2。

这有帮助还是实际上更令人困惑?

答案 4 :(得分:0)

首先,函数内部的$ count和函数外部的$ count是2个不同的变量。这就解释了为什么第一个输出打印5。

现在对于static:静态意味着当函数第一次执行时,您的局部变量只创建一次。之后的每个函数执行都使用相同的变量,因此最后一个函数执行中的变量的最新值仍然存在。

因此,当您第一次调用get_count()时,该变量设置为0然后返回。返回后,变量递增。

当您第二次调用该函数时,该变量仍为1.返回此值,然后递增为2.

答案 5 :(得分:-1)

PHP有一个众所周知的static关键字,在面向对象的PHP中被广泛用于定义静态方法和属性,但是应该记住static也可以在函数内部用来定义静态变量

它是什么'静态变量'?

静态变量与函数范围中定义的普通变量不同,只要在程序执行离开此范围时它没有松散值。让我们考虑以下使用静态变量的示例:

function countSheep($num) {
 static $counter = 0;
 $counter += $num;
 echo "$counter sheep jumped over fence";
}

countSheep(1);
countSheep(2);
countSheep(3);

结果:

1 sheep jumped over fence
3 sheep jumped over fence
6 sheep jumped over fence

如果我们在没有$counter的情况下定义static,那么每次回显的值都会与传递给函数的$num参数相同。使用static可以构建这个简单的计数器而无需额外的解决方法。

静态变量用例

  1. 在后续的函数调用之间存储值。
  2. 当没有办法(或没有办法)时,在递归调用之间存储值 目的)将它们作为参数传递。
  3. 缓存通常最好检索一次的值。对于 例如,在服务器上读取不可变文件的结果。
  4. 技巧

    静态变量仅存在于本地函数范围内。它不可能是     在已经定义的函数之外访问。所以你可以     确保它在下次调用之前保持其值不变     那个功能。

    静态变量只能定义为标量或标量     表达式(自PHP 5.6起)。不可避免地为其分配其他值     至少在撰写本文时,导致失败。 不过,您只能在代码的下一行执行此操作:

    function countSheep($num) {
      static $counter = 0;
      $counter += sqrt($num);//imagine we need to take root of our sheep each time
      echo "$counter sheep jumped over fence";
    }
    

    结果:

    2 sheep jumped over fence
    5 sheep jumped over fence
    9 sheep jumped over fence
    

    静态功能有点共享'在对象的方法之间     同班。通过查看以下示例很容易理解:

    class SomeClass {
      public function foo() {
        static $x = 0;
        echo ++$x;
      }
    }
    
    $object1 = new SomeClass;
    $object2 = new SomeClass;
    
    $object1->foo(); // 1
    $object2->foo(); // 2 oops, $object2 uses the same static $x as $object1
    $object1->foo(); // 3 now $object1 increments $x
    $object2->foo(); // 4 and now his twin brother
    

    这仅适用于同一类的对象。如果对象来自不同的类(甚至相互延伸),静态变量的行为将如预期的那样。

    静态变量是在函数调用之间保持值的唯一方法吗?

    在函数调用之间保持值的另一种方法是使用闭包。闭包在PHP 5.3中引入。用两个词来说,它们允许您将对函数范围内某些变量集的访问限制为另一个匿名函数,这是访问它们的唯一方法。处于闭包变量中可能会模仿(或多或少成功)OOP概念,例如类常数' (如果他们通过价值关闭)或私人财产' (如果通过引用传递)在结构化编程中。

    后者实际上允许使用闭包而不是静态变量。使用什么总是由开发人员决定,但应该提到静态变量在处理递归时非常有用,并且值得开发人员注意。