函数内的“静态”关键字?
我正在查看Drupal 7的源代码,我发现了一些我以前从未见过的东西。我在php手册中做了一些初步的查找,但它没有解释这些例子。
关键字对函数内的变量有什么作用?static
function module_load_all($bootstrap = FALSE) {
static $has_run = FALSE
我正在查看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