PHP和Java中都会有static
这个关键字,用法也类似,当问及PHP中的static
用法是,很容易想出static
可以声明类属性或方法为静态,静态属性和方法都是属于类的,静态属性不能通过对象访问,但静态方法可以通过对象访问。没错,是这样的,但是在PHP中static
还有另外的用处哦。
先从static变量的作用域开始
PHP中static
变量只存在于本地函数中,但是当程序执行完本函数后,static
变量还会一直存在,考虑如下代码:
<?php
function test()
{
$a = 0;
echo $a . "\n";
$a++;
}
// 都会输出0
for ($i=0; $i<5; $i++) {
test();
}
在每次调用这个函数的时候,函数都会将$a
变量置0,再输出,尽管每次输出后,变量$a
都加1了,为了每次都能将$a
的值保存起来,我们可以将它声明为static
:
<?php
function test()
{
static $a = 0;
echo $a . "\n";
$a++;
}
// 输出
// 0
// 1
// 2
// 3
// 4
for ($i=0; $i<5; $i++) {
test();
}
现在,$a
只被初始化了一次,每次调用test()
函数时,$a
都会加1。
在递归函数中,同样可以使用静态变量,我们可以设置一个$count
静态变量的函数运行计数器,保存运行的次数,当$count
到10时,就退出递归函数,如下:
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
}
test();
静态变量初始化时只能是确定的一个值,不能是函数的返回值,下面的代码中,将sqrt()
函数的结果赋值给静态变量$a
会报错:
function foo(){
static $a = 0; // correct
static $a = 1+2; // correct (as of PHP 5.6)
static $a = sqrt(121); // wrong (as it is a function)
echo $a;
}
foo();
程序没有运行前,再phpstorm中就已经其实不能用表达式初始化静态变量:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PBBUxh1F-1603612876125)(http://p8m3309kb.bkt.clouddn.com/assign%20expression%20to%20static.png)]
程序运行时也会报如下错误:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oaoddliZ-1603612876127)(http://p8m3309kb.bkt.clouddn.com/run%20assign%20expression%20to%20static.png)]