静态关键字里面的函数?

我正在查看Drupal 7的源代码,并且发现了一些我以前没见过的东西。 我在php手册中做了一些初步的工作,但没有解释这些例子。

关键字static对函数内部的variables有什么作用?

 function module_load_all($bootstrap = FALSE) { static $has_run = FALSE 

它使得函数在多次调用之间记住给定variables的值(在你的例子中是$has_run )。

您可以将其用于不同的目的,例如:

 function doStuff() { static $cache = null; if ($cache === null) { $cache = '%heavy database stuff or something%'; } // code using $cache } 

在这个例子中, if只会被执行一次。 即使多次调用doStuff也会发生。

就像目前为止没有人提到的那样,同一类的不同实例中的静态variables保持其状态。 所以在编写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 

如果你想让一个静态variables只为当前类实例记住它的状态,你最好坚持一个类属性,像这样:

 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 。 variables$v在函数结束后不会被垃圾收集,因为它是一个静态(非dynamic)variables。 variables将保持在其范围内,直到脚本完全结束。

所以下面再来个电话

 a(15); 

然后输出20 ,然后设置$v15

静态工作方式与在课堂上的工作方式相同。 variables在函数的所有实例中共享。 在你的例子中,一旦函数运行,$ has_run被设置为TRUE。 所有将来运行的函数都将具有$ has_run = TRUE。 这在recursion函数中特别有用(作为传递计数的替代方法)。

一个静态variables只存在于一个局部函数作用域中,但是当程序执行离开这个作用域时它不会丢失它的值。

http://php.net/manual/en/language.variables.scope.php

函数中的静态variables意味着无论您调用函数多less次,只有一个variables。

 <?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 ?> 

为了扩大杨的答案

如果使用静态variables扩展一个类,那么单个扩展类将保存在实例之间共享的“自己”引用静态。

 <?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

http://ideone.com/W4W5Qv

在函数内部, static意味着每次在页面加载期间调用该函数时,该variables将保持其值。

因此,在你给出的例子中,如果你调用一个函数两次,如果它设置$has_runtrue ,那么函数将能够知道它以前被调用,因为$has_run仍然会等于true第二次开始。

在这个上下文中的static关键字的用法在这里的PHP手册中解释: http : //php.net/manual/en/language.variables.scope.php