PHP имеет хорошо известное ключевое слово static
, которое широко используется в объектно-ориентированном PHP для определения статических методов и свойств, но следует помнить, что static
может также использоваться внутри функций для определения статических переменных.
Что такое «статическая переменная»?
Статическая переменная отличается от обычной переменной, определенной в области видимости функции, в том случае, если она не теряет значение, когда выполнение программы выходит из этой области. Давайте рассмотрим следующий пример использования статических переменных:
function countSheep($num) {
static $counter = 0;
$counter += $num;
echo "$counter sheep jumped over fence";
}
countSheep(1);
countSheep(2);
countSheep(3);
Результат:
1 sheep jumped over fence
3 sheep jumped over fence
6 sheep jumped over fence
Если бы мы определили $counter
без static
, то каждый раз, когда отображаемое значение будет совпадать с параметром $num
, переданным функции. Использование static
позволяет построить этот простой счетчик без дополнительных обходных путей.
Примеры использования статических переменных
- Для сохранения значений между последовательными вызовами функции.
- Для сохранения значений между рекурсивными вызовами, когда нет возможности (или нет
цель) передать их как params.
- Для кэширования значения, которое обычно лучше получить один раз. За
пример, результат чтения неизменяемого файла на сервере.
Tricks
Статическая переменная существует только в локальной области действия функции. Не может быть
доступ вне функции, в которой она была определена.
будьте уверены, что оно сохранит свое значение без изменений до следующего вызова
эта функция.
Статическая переменная может быть определена только как скаляр или скаляр
выражение (начиная с PHP 5.6). Присвоение ему других значений неизбежно
приводит к провалу хотя бы на момент написания этой статьи.
Тем не менее, вы можете сделать это только на следующей строке вашего кода:
function countSheep($num) {
static $counter = 0;
$counter += sqrt($num);//imagine we need to take root of our sheep each time
echo "$counter sheep jumped over fence";
}
Результат:
2 sheep jumped over fence
5 sheep jumped over fence
9 sheep jumped over fence
Статическая функция как бы «разделяется» между методами объектов
тот же класс. Это легко понять, просмотрев следующий пример:
class SomeClass {
public function foo() {
static $x = 0;
echo ++$x;
}
}
$object1 = new SomeClass;
$object2 = new SomeClass;
$object1->foo(); // 1
$object2->foo(); // 2 oops, $object2 uses the same static $x as $object1
$object1->foo(); // 3 now $object1 increments $x
$object2->foo(); // 4 and now his twin brother
Это работает только с объектами того же класса. Если объекты принадлежат к разным классам (даже расширяют друг друга), поведение статических переменных будет таким, как ожидалось.
Является ли статическая переменная единственным способом сохранения значений между вызовами функции?
Другой способ сохранить значения между вызовами функций - использовать замыкания. Замыкания были введены в PHP 5.3. В двух словах они позволяют вам ограничить доступ к некоторому набору переменных в области действия функции другой анонимной функции, которая будет единственным способом доступа к ним. Находящиеся в замыкании переменные могут имитировать (более или менее успешно) такие концепции ООП, как «константы класса» (если они были переданы в замыкании по значению) или «частные свойства» (если переданы по ссылке) в структурном программировании.
Последнее фактически позволяет использовать замыкания вместо статических переменных. Что использовать, решать только разработчикам, но следует отметить, что статические переменные, безусловно, полезны при работе с рекурсиями и заслуживают того, чтобы их заметили разработчики.