Разработчику. Сборник рецептов PHP
Задавайте вопросы

Статические переменные

Вернуться назад

Задача

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

Решение

Объявите переменную как статическую:

function track_times_called() {
      static $i = 0;
      $i++;
      return $i;
}

Обсуждение

Функция запоминает переменную, объявленную как статическую. Поэтому при последовательных вызовах функций можно получить доступ к значению сохраненной переменной. Функция pc_check_the_count(), показанная в примере, описсаном ниже, содержит статическую переменную, позволяющую отслеживать удары и мячи для отбивающего в бейсболе.

Пример pc_check_the_count()

function pc_check_the_count($pitch) {
      static $strikes = 0;
      static $balls = 0;

switch ($pitch) {
      case 'foul':
            if (2 == $strikes) break; // при двух ударах
                                                            ничего не происходит
            // в противном случае действует, как удар
      case 'strike':
            $strikes++;
            break;
      case 'ball':
            $balls++;
            break;
      }

      if (3 == $strikes) {
            $strikes = $balls = 0;
            return 'strike out';
      }
      if (4 == $balls) {
            $strikes = $balls = 0;
            return 'walk';
      }
      return 'at bat';
}

$what_happened = check_the_count($pitch);

Логика происходящего с отбивающим, зависящая от количества подач, содержится в операторе switch внутри функции pc_check_the_count(). Вместо этого можно вернуть количество ударов и мячей, пробежек или простоев, но тогда надо добавить соответствующий код проверки на отражения ударов, пробежки и простои.

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

См. также

Документацию по статическим переменным на http://www.php.net/language.variables.scope.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ