PHP静态variables

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

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

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

 $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) 

我希望这清楚你的想法。

你有两个单独的variables,都被称为$计数,但他们有一个不同的范围 。 第一个variables没有被明确声明,但是当你第一次赋值的时候就已经存在了。

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

至于增量运算符(++),由于( 一元 )运算符位于variables名称后面,因此计算结果为增量的值。 所以是的,输出将是5,0,1。
如果你要写return ++$count; ,结果会是5,1,2。

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

第一个回声:给你你在第一行中声明的variables$ count。

第二个回声:calles get_count创build静态variables$ count(所以它在这个函数的上下文中),当你实例化静态variables时,你将它设置为零。 return $ count ++是我们通常在代码中避免的那些行之一 – 但实际上,在返回值之后它会增加。

第三个回声:类似地,0在前面的get_count调用之后递增为1,这里同样发生 – 它返回1并且将该值递增到2。

这有帮助还是更实际上更混乱?

那么首先,函数内的$ count和函数外的$ count是两个不同的variables。 这解释了为什么第一个输出打印5。

现在对于静态:静态意味着当函数第一次执行时,只创build一次局部variables。 之后的每个函数执行都使用相同的variables,所以最后一个函数执行过程中最新的variables值仍然存在。

所以,当你第一次调用get_count()时,variables被设置为0,然后返回。 返回后,variables增加。

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

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

什么是“静态variables”?

静态variables不同于函数作用域中定义的普通variables,当程序执行离开这个作用域时,它的值不会松动。 我们来考虑一下使用静态variables的例子:

 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 ,那么每次echo的值和传递给函数的$num参数是一样的。 使用static允许build立这个简单的计数器没有额外的解决方法。

静态variables的用例

  1. 在相应的函数之间存储值。
  2. 在没有办法(或无目的)将它们作为parameter passing时,在recursion调用之间存储值。
  3. 要caching通常更好的值来检索一次。 例如,读取服务器上不可变文件的结果。

技巧

静态variables仅存在于本地函数作用域中。 它不能被定义的函数以外的地方访问。所以你可以确定它将保持其值不变,直到下一次调用该函数。

静态variables只能定义为标量或标量expression式(自PHP 5.6起)。 至less在写这篇文章的时候,指定其他的值不可避免地会导致失败。 不过,您可以在代码的下一行执行此操作:

 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 

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

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

在函数调用之间保持值的另一种方法是使用闭包。 在PHP 5.3中引入了闭包。 用两个字来说,它们允许你限制对一个函数范围内的一些variables的访问权限到另一个匿名函数,这将是访问它们的唯一方法。 在闭包variables中,可能会模仿(或多或less)成功的OOP概念,如结构化编程中的“类常量”(如果它们是通过值封闭传递的)或“私有属性”(如果通过引用传递)。

后者实际上允许使用闭包而不是静态variables。 使用什么总是由开发人员决定,但应该提到的是,静态variables在处理recursion时肯定是有用的,值得开发人员注意。