我正在查看Drupal 7的来源,我发现了一些我以前没见过的东西。我做了一些初步查看php手册,但它没有解释这些例子。
关键字static
对函数内的变量做了什么?
function module_load_all($bootstrap = FALSE) {
static $has_run = FALSE
答案 0 :(得分:134)
它使函数在多次调用之间记住给定变量(在您的示例中为$has_run
)的值。
您可以将其用于不同目的,例如:
function doStuff() {
static $cache = null;
if ($cache === null) {
$cache = '%heavy database stuff or something%';
}
// code using $cache
}
在此示例中,if
只会执行一次。即使多次调用doStuff
也会发生。
答案 1 :(得分:66)
似乎到目前为止没有人提到过,同一类的不同实例中的静态变量仍然是它们的状态。因此在编写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
答案 2 :(得分:13)
给出以下示例:
function a($s){
static $v = 10;
echo $v;
$v = $s;
}
第一次致电
a(20);
将输出10
,然后$v
输出为20
。函数结束后,变量$v
不会被垃圾收集,因为它是一个静态(非动态)变量。该变量将保持在其范围内,直到脚本完全结束。
因此,以下调用
a(15);
然后将输出20
,然后将$v
设置为15
。
答案 3 :(得分:8)
Static的工作方式与在类中的工作方式相同。该变量在函数的所有实例中共享。在您的特定示例中,一旦运行该函数,$ has_run将设置为TRUE。该函数的所有未来运行都将具有$ has_run = TRUE。这在递归函数中特别有用(作为传递计数的替代方法)。
静态变量仅存在于 本地功能范围,但它没有 程序执行时失去价值 离开了这个范围。
答案 4 :(得分:3)
函数中的静态变量意味着无论你调用函数多少次,都只有一个变量。
<?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
?>
答案 5 :(得分:2)
如果使用静态变量扩展一个类,则各个扩展类将保留它们在实例之间共享的“自己的”引用静态。
<?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个
的 2 强>:1
之一:2
一个:3&lt; - x_repeat
之一:4
一个:5&lt; - x_repeat
的 2 强>:2
答案 6 :(得分:1)
在函数内部,static
表示每次在页面加载的生命周期内调用函数时,变量都将保留其值。
因此,在您给出的示例中,如果您将函数调用两次,如果将$has_run
设置为true
,则该函数将能够知道它之前已被调用,因为{当函数第二次启动时,{1}}仍然等于$has_run
。
在此上下文中使用true
关键字在PHP手册中进行了解释:http://php.net/manual/en/language.variables.scope.php