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

问题描述 投票:98回答:7

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

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

function module_load_all($bootstrap = FALSE) {
    static $has_run = FALSE
php function static keyword
7个回答
140
投票

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

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

function doStuff() {
  static $cache = null;

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

  // code using $cache
}

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


70
投票

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

13
投票

给出以下示例:

function a($s){
    static $v = 10;
    echo $v;
    $v = $s;
}

第一次打电话

a(20);

将输出10,然后$v20。函数结束后,变量$v不会被垃圾收集,因为它是一个静态(非动态)变量。变量将保持在其范围内,直到脚本完全结束。

因此,以下调用

a(15);

然后将输出20,然后将$v设置为15


8
投票

Static的工作方式与在类中的工作方式相同。该变量在函数的所有实例中共享。在您的特定示例中,一旦运行该函数,$ has_run将设置为TRUE。该函数的所有未来运行都将具有$ has_run = TRUE。这在递归函数中特别有用(作为传递计数的替代方法)。

静态变量仅存在于本地函数作用域中,但在程序执行离开此作用域时它不会丢失其值。

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


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

?>

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 二:1 之一:2 一:3 < - x_repeat 之一:4 一:5 < - x_repeat 二:2

http://ideone.com/W4W5Qv


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.