За последние 24 часа нас посетили 62129 программистов и 1777 роботов. Сейчас ищут 1622 программиста ...

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

Тема в разделе "PHP для новичков", создана пользователем kilogram, 31 мар 2012.

  1. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Код (Text):
    1. <html><body>
    2. <?php
    3. function selfcount() {
    4.  static $count = 0;
    5.  $count++;
    6.  echo $count;
    7. }
    8. for($i=0; $i<5; $i++)
    9. selfcount();
    10. ?>
    11. </body></html>
    Почему со словом static в результате получается 12345, а без этого слова 11111?
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Обычная переменная создаётся в теле функции каждый раз. После объявления и инициаизации $count = 0; в ней будет 0. В следующей строке $count++; вы увеличиваете значение на 1.
    С модификатором static же переменная остаётся доступной из той же функции, но не объявляется и не инициализируется заново. Сработала функция, осталась единица. При следующем вызове берётся эта единица и прибавляется ещё единица, получается 2.
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    при статике переменная становится общей для всех вызовов этой функции. 5 вызовов, 5 инкрементов, в результате 1-2-3-4-5 (минусы в примере разделяют вызовы функции)
    при не статике - переменная локальна для каждого отдельного вызова функции. каждый вызов ее определяет в 0 и инкрементирует до 1. 5 вызовов, 5 определений 0 и инкрементов до 1, в результате 1-1-1-1-1

    Добавлено спустя 58 секунд:
    YSandro, неужели я так медленно пишу?(((
     
  4. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    А с обычной переменной объявленной в функции без слова static после вызова функции, функция возвратила свое значение, и значения всех переменных при следующем вызове обнуляются?
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ganzal, ))) ну если ты только через 58 секунд дописал "YSandro, неужели я так медленно пишу?(((", то да, медленно.

    kilogram, обычные переменные после вызова как бы исчезают. Создаются переменные с тем же именем, но указывающие на другую область в памяти, то есть, новенькие совсем.