`static`关键字里面有什么功能?

时间:2011-05-31 14:21:22

标签: php function static keyword

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

关键字static对函数内的变量做了什么?

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

7 个答案:

答案 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。这在递归函数中特别有用(作为传递计数的替代方法)。

  

静态变量仅存在于   本地功能范围,但它没有   程序执行时失去价值   离开了这个范围。

请参阅http://php.net/manual/en/language.variables.scope.php

答案 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)

展开the answer of Yang

如果使用静态变量扩展一个类,则各个扩展类将保留它们在实例之间共享的“自己的”引用静态。

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

http://ideone.com/W4W5Qv

答案 6 :(得分:1)

在函数内部,static表示每次在页面加载的生命周期内调用函数时,变量都将保留其值。

因此,在您给出的示例中,如果您将函数调用两次,如果将$has_run设置为true,则该函数将能够知道它之前已被调用,因为{当函数第二次启动时,{1}}仍然等于$has_run

在此上下文中使用true关键字在PHP手册中进行了解释:http://php.net/manual/en/language.variables.scope.php