Статические переменные — что это такое и когда их следует использовать?

Я пытаюсь понять, что такое статические переменные.

К ним можно получить доступ без создания экземпляра класса, но какие еще преимущества они имеют и когда их следует использовать?

Например, в моем классе есть приватная переменная, которая содержит имя твиттер-канала, который я пытаюсь получить.

Это должно быть статическим? Его никогда не нужно менять.


person panthro    schedule 11.11.2013    source источник
comment
Не дубликат. Я спрашиваю о варах, а не о методах.   -  person panthro    schedule 11.11.2013
comment
Если его никогда не нужно менять, почему бы не использовать constant?   -  person h2ooooooo    schedule 11.11.2013
comment
Если его никогда не нужно менять, сделайте его постоянным. С другой стороны, класс твиттер-канала может иметь несколько экземпляров, каждый из которых ссылается на другой канал, так что это будет обычная переменная экземпляра (называемая «свойством» в PHP).   -  person GolezTrol    schedule 11.11.2013
comment
@ j08691 j08691 Он говорит о статических переменных, а не о статических методах. Статические переменные нужны, когда вы хотите, чтобы переменная внутри функции сохраняла свое значение, если функция вызывается снова.   -  person Ben Fortune    schedule 11.11.2013
comment
Вам также может быть полезно прочитать здесь: [stackoverflow.com/questions/10795502/ [1]: stackoverflow.com/questions/10795502/   -  person mcwyrm    schedule 11.11.2013


Ответы (4)


Статические переменные нужны, когда вы хотите, чтобы переменная внутри функции сохраняла свое значение, если функция вызывается снова.

Пример статической переменной может быть следующим.

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

echo addOne();
echo addOne();
echo addOne();

Что бы вернуться

123

Без ключевого слова static это просто вернет

111

В своем вопросе вы упоминаете, что у вас есть данные, которые не нужно будет изменять. Как указано в комментариях к вопросу, вы должны сделать это константой.

person Ben Fortune    schedule 11.11.2013
comment
Спасибо за объяснение. Отлично. Что касается констант, зачем мне использовать одну вместо частной переменной? Мне не нужен доступ к var вне класса? Что лучше всего будет использовать? - person panthro; 11.11.2013
comment
Если вы уверены, что его не нужно будет менять, то константа подойдет. Частные переменные в основном используются для передачи данных по классу, переходя от одной функции к другой с возможностью изменения переменной. - person Ben Fortune; 11.11.2013
comment
Также полезно, если вы расширяете родительский класс... например, у меня есть набор небольших словарей для обработки многоязычных исключений. Я устанавливаю статическую переменную $sLangCode один раз в родительском элементе (на основе текущей локали, в которой работает приложение) в файле типа app.ini.php, а затем всякий раз, когда система выдает исключение, независимо от ТИПА исключения, потому что все они расширяют этот базовый класс (который сам расширяет Exception) все сообщения об ошибках правильно локализованы... если вы понимаете, что я имею в виду. - person CD001; 11.11.2013

Как правило, вещи, которые не относятся к конкретному экземпляру, но должны храниться в переменной, должны быть статическими переменными. В противном случае это руководство сообщает подробности: http://php.net/manual/en/language.variables.scope.php

В противном случае вы также можете рассмотреть возможность использования констант. Для примера, который вы упомянули (как писали другие), использование констант кажется наиболее разумным. (Либо константа класса, либо простая.)

person Lajos Veres    schedule 11.11.2013

Короче говоря, статические переменные можно использовать в качестве констант.

Например, класс Math может иметь статические переменные; ИП и т.д.

person Community    schedule 11.11.2013
comment
Вы можете изменять статические переменные, но не константы... - person Lajos Veres; 11.11.2013
comment
Большинство статических переменных являются константами. Я имею в виду классовую перспективу. - person ; 11.11.2013

Допустим, у вас есть что-то в классе, что вам понадобится позже.

Теперь вам нужна эта штука, но на самом деле вам не нужно|хотите|должны создавать новый экземпляр этого класса.

Вот почему вы используете статический метод/свойство

person Guillermo Mansilla    schedule 11.11.2013