函数内的“静态”关键字?

2022-08-30 07:11:21

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

关键字对函数内的变量有什么作用?static

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

答案 1

它使函数记住多个调用之间给定变量的值(在您的示例中)。$has_run

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

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}

在此示例中,将只执行一次。即使会发生多次调用。ifdoStuff


答案 2

到目前为止,似乎没有人提到,同一类的不同实例中的静态变量仍然是它们的状态。因此,在编写 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

推荐