Я искал исходники Drupal 7 и нашел кое-что, чего раньше не видел. Я сначала просмотрел руководство по php, но оно не объясняло эти примеры.
Что ключевое слово static
делает с переменной внутри функции?
function module_load_all($bootstrap = FALSE) {
static $has_run = FALSE
Ответы:
Это заставляет функцию запоминать значение данной переменной (
$has_run
в вашем примере) между несколькими вызовами.Вы можете использовать это для разных целей, например:
В этом примере
if
будет выполняться только один раз. Даже еслиdoStuff
произойдет несколько вызовов .источник
$cache
вnull
при последующих вызовах, верно?$cache
будет сброшен только между запросами. Так что да, он не будет сброшен при последующих вызовах в том же запросе (или выполнении скрипта).if
проверка условий$cache === null
будет выполняться каждый раз, когда эта функция вызывается, не думаю , что код блока$cache = '..'
будет выполнен.Похоже, что до сих пор никто не упоминал, что статические переменные внутри разных экземпляров одного и того же класса остаются в своем состоянии. Так что будьте осторожны при написании кода ООП.
Учти это:
Если вы хотите, чтобы статическая переменная запоминала свое состояние только для текущего экземпляра класса, вам лучше придерживаться свойства класса, например:
источник
Рассмотрим следующий пример:
Первый звонок
выведет
10
, значит$v
быть20
. Переменная$v
не собирается в мусор после завершения функции, поскольку это статическая (нединамическая) переменная. Переменная останется в пределах своей области до полного завершения скрипта.Поэтому следующий вызов
затем будет выводиться
20
, а затем будет установлено$v
значение15
.источник
Статика работает так же, как и в классе. Переменная является общей для всех экземпляров функции. В вашем конкретном примере после запуска функции $ has_run устанавливается в TRUE. Все будущие запуски функции будут иметь $ has_run = TRUE. Это особенно полезно в рекурсивных функциях (как альтернатива передаче счетчика).
См. Http://php.net/manual/en/language.variables.scope.php
источник
статическая переменная в функции означает, что независимо от того, сколько раз вы вызываете функцию, существует только 1 переменная.
источник
Чтобы расширить ответ Янга
Если вы расширяете класс статическими переменными, отдельные расширенные классы будут содержать свои «собственные» статические данные, на которые ссылаются, которые совместно используются между экземплярами.
выходы:
http://ideone.com/W4W5Qv
источник
Внутри функции
static
означает, что переменная будет сохранять свое значение каждый раз, когда функция вызывается во время загрузки страницы.Поэтому в приведенном вами примере, если вы вызовете функцию дважды, если она установлена
$has_run
в значениеtrue
, тогда функция сможет узнать, что она была ранее вызвана, потому$has_run
что она все равно будет равна,true
когда функция запускается во второй раз.Использование
static
ключевого слова в этом контексте объясняется в руководстве по PHP здесь: http://php.net/manual/en/language.variables.scope.phpисточник