"статический" ключевое слово внутри функции?


Я смотрел на источник для Drupal 7, и я нашел некоторые вещи, которые я раньше не видела. Я сделал некоторые первоначальные поиски в руководстве php, но он не объяснил эти примеры.

что означает слово static сделать переменную внутри функции?

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

7 ответов:

это заставляет функцию запоминать значение данной переменной ($has_run в вашем примере) между несколькими вызовами.

вы можете использовать это для различных целей, например:

function doStuff() {
  static $cache = null;

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

  // code using $cache
}

в этом примере if будет выполняться только один раз. Даже если несколько вызовов doStuff будет заполнен.

похоже, что никто не упоминал до сих пор, что статические переменные внутри разных экземпляров одного и того же класса остаются их состоянием. Поэтому будьте осторожны при написании кода ООП.

рассмотрим следующий пример:

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

приводит следующий пример:

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

первый вызов

a(20);

выводит 10, потом $v на 20. Переменная $v не является мусором, собранным после завершения функции, так как это статическая (нединамическая) переменная. Переменная будет оставаться в пределах своей области до полного завершения скрипта.

поэтому следующий вызов

a(15);
выводит 20, а затем установить $v будет 15.

статика работает так же, как и в классе. Переменная является общей для всех экземпляров функции. В вашем конкретном примере после запуска функции $has_run имеет значение TRUE. Все будущие запуски функции будут иметь $has_run = TRUE. Это особенно полезно в рекурсивных функциях (как альтернатива передаче счетчика).

статическая переменная существует только в локальная область действия функции, но это не так теряют свое значение при выполнении программы оставляет эту область.

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

статической переменной в функции означает, что независимо от того, сколько раз вы вызываете функцию, есть только 1 переменная.

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

?>

расширить на ответ Ян

Если вы расширяете класс со статическими переменными, отдельные расширенные классы будут содержать свои "собственные" статические ссылки, которые разделяются между экземплярами.

<?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 один:4
один:5 два:2

http://ideone.com/W4W5Qv

функции static означает, что переменная будет сохранять свое значение каждый раз, когда функция вызывается во время жизни загрузки страницы.

поэтому в приведенном примере, если вы вызываете функцию дважды, если она установлена $has_run to true, тогда функция сможет узнать, что она ранее была вызвана, потому что $has_run прежнему будет равна true когда функция запускается во второй раз.

использование static ключевое слово в этой контекст объясняется в руководстве PHP здесь:http://php.net/manual/en/language.variables.scope.php