静态关键字里面的函数?
我正在查看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
,然后设置$v
为15
。
静态工作方式与在课堂上的工作方式相同。 variables在函数的所有实例中共享。 在你的例子中,一旦函数运行,$ has_run被设置为TRUE。 所有将来运行的函数都将具有$ has_run = TRUE。 这在recursion函数中特别有用(作为传递计数的替代方法)。
一个静态variables只存在于一个局部函数作用域中,但是当程序执行离开这个作用域时它不会丢失它的值。
函数中的静态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
在函数内部, static
意味着每次在页面加载期间调用该函数时,该variables将保持其值。
因此,在你给出的例子中,如果你调用一个函数两次,如果它设置$has_run
为true
,那么函数将能够知道它以前被调用,因为$has_run
仍然会等于true
第二次开始。
在这个上下文中的static
关键字的用法在这里的PHP手册中解释: http : //php.net/manual/en/language.variables.scope.php