Answers:
它使函数记住$has_run
多次调用之间给定变量的值(在您的示例中)。
您可以将其用于不同的目的,例如:
function doStuff() {
static $cache = null;
if ($cache === null) {
$cache = '%heavy database stuff or something%';
}
// code using $cache
}
在此示例中,if
只能执行一次。即使doStuff
会发生多次呼叫。
$cache
to 的值重置null
,对吗?
$cache
仅在两次请求之间被重置。因此,是的,在同一请求(或脚本执行)中,以后的调用不会重置它。
if
条件检查$cache === null
会在每次调用此函数时执行,但不要以为是否$cache = '..'
会执行块代码。
到目前为止似乎没有人提及,同一类的不同实例内的静态变量保持其状态。因此,编写OOP代码时要小心。
考虑一下:
class Foo
{
public function call()
{
static $test = 0;
$test++;
echo $test . PHP_EOL;
}
}
$a = new Foo();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3
$b = new Foo();
$b->call(); // 4
$b->call(); // 5
如果您希望静态变量仅记住当前类实例的状态,则最好坚持使用类属性,如下所示:
class Bar
{
private $test = 0;
public function call()
{
$this->test++;
echo $this->test . PHP_EOL;
}
}
$a = new Bar();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3
$b = new Bar();
$b->call(); // 1
$b->call(); // 2
静态的工作方式与类相同。该变量在函数的所有实例之间共享。在您的特定示例中,函数运行后,$ has_run设置为TRUE。该函数的所有将来运行将具有$ has_run = TRUE。这在递归函数中特别有用(作为传递计数的替代方法)。
静态变量仅存在于局部函数作用域中,但是当程序执行离开该作用域时,它不会丢失其值。
函数中的静态变量意味着无论调用该函数多少次,都只有1个变量。
<?php
class Foo{
protected static $test = 'Foo';
function yourstatic(){
static $test = 0;
$test++;
echo $test . "\n";
}
function bar(){
$test = 0;
$test++;
echo $test . "\n";
}
}
$f = new Foo();
$f->yourstatic(); // 1
$f->yourstatic(); // 2
$f->yourstatic(); // 3
$f->bar(); // 1
$f->bar(); // 1
$f->bar(); // 1
?>
扩大对杨的回答
如果使用静态变量扩展类,则各个扩展类将保留在实例之间共享的“自己的”引用静态。
<?php
class base {
function calc() {
static $foo = 0;
$foo++;
return $foo;
}
}
class one extends base {
function e() {
echo "one:".$this->calc().PHP_EOL;
}
}
class two extends base {
function p() {
echo "two:".$this->calc().PHP_EOL;
}
}
$x = new one();
$y = new two();
$x_repeat = new one();
$x->e();
$y->p();
$x->e();
$x_repeat->e();
$x->e();
$x_repeat->e();
$y->p();
输出:
一:1
二:1
一:2
一:3 <-x_repeat
一:4
一:5 <-x_repeat
二:2
在函数内部,这static
意味着在页面加载期间,每次调用函数时,变量将保留其值。
因此,在您给出的示例中,如果调用一个函数两次,如果将其设置$has_run
为true
,则该函数将能够知道该函数先前已被调用,因为它$has_run
仍然等于true
该函数第二次启动的时间。
static
在此上下文中,关键字的用法在PHP手册中进行了说明:http : //php.net/manual/zh/language.variables.scope.php