我正在查看Drupal 7的来源,我发现了一些我以前没见过的东西。我做了一些初步查看php手册,但它没有解释这些例子。
关键字static
对函数内的变量做了什么?
function module_load_all($bootstrap = FALSE) {
static $has_run = FALSE
它使函数在多次调用之间记住给定变量(在您的示例中为$has_run
)的值。
您可以将其用于不同目的,例如:
function doStuff() {
static $cache = null;
if ($cache === null) {
$cache = '%heavy database stuff or something%';
}
// code using $cache
}
在这个例子中,if
只会被执行一次。即使多次调用doStuff
也会发生。
似乎到目前为止没有人提到过,同一个类的不同实例中的静态变量仍然是它们的状态。编写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
给出以下示例:
function a($s){
static $v = 10;
echo $v;
$v = $s;
}
第一次打电话
a(20);
将输出10
,然后$v
为20
。函数结束后,变量$v
不会被垃圾收集,因为它是一个静态(非动态)变量。变量将保持在其范围内,直到脚本完全结束。
因此,以下调用
a(15);
然后将输出20
,然后将$v
设置为15
。
Static的工作方式与在类中的工作方式相同。该变量在函数的所有实例中共享。在您的特定示例中,一旦运行该函数,$ has_run将设置为TRUE。该函数的所有未来运行都将具有$ has_run = TRUE。这在递归函数中特别有用(作为传递计数的替代方法)。
静态变量仅存在于本地函数作用域中,但在程序执行离开此作用域时它不会丢失其值。
函数中的静态变量意味着无论调用函数多少次,都只有一个变量。
<?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/en/language.variables.scope.php