"статический" ключевое слово внутри функции?
Я смотрел на источник для Drupal 7, и я нашел некоторые вещи, которые я раньше не видела. Я сделал некоторые первоначальные поиски в руководстве php, но он не объяснил эти примеры.
что означает слово static
сделать переменную внутри функции?
function module_load_all($bootstrap = FALSE) {
static $has_run = FALSE
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. Это особенно полезно в рекурсивных функциях (как альтернатива передаче счетчика).
статическая переменная существует только в локальная область действия функции, но это не так теряют свое значение при выполнении программы оставляет эту область.
статической переменной в функции означает, что независимо от того, сколько раз вы вызываете функцию, есть только 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
функции
static
означает, что переменная будет сохранять свое значение каждый раз, когда функция вызывается во время жизни загрузки страницы.поэтому в приведенном примере, если вы вызываете функцию дважды, если она установлена
$has_run
totrue
, тогда функция сможет узнать, что она ранее была вызвана, потому что$has_run
прежнему будет равнаtrue
когда функция запускается во второй раз.использование
static
ключевое слово в этой контекст объясняется в руководстве PHP здесь:http://php.net/manual/en/language.variables.scope.php