Я начал изучать OO несколько дней назад, я вполне уверен в процедурной кодировке, но, очевидно, этого недостаточно, и я хочу стать хорошо разбирающимся кодером с большим опытом и знаниями, поэтому первое, что нужно полностью изучить, должно быть OO я думаю, правильные шаблоны дизайна.
Во всяком случае, у меня есть одна вещь, где я застрял, и я не совсем понимаю …
Статические переменные … Я понимаю, что статическая переменная не теряет значение, даже если исполняемая функция завершена, и будет сохранять ее, если одна и та же функция будет выполнена снова, и т. Д. И т. Д.
Но я не понимаю, что именно теперь вы можете назначить статической переменной? В руководстве, а также бесчисленном вопросе о состоянии stackoverflow вы не можете назначить выражение статической переменной.
Итак, я прочитал руководство по PHP, чтобы точно узнать, что считается выражением? Ответы руководства (и я цитирую):
«В PHP почти все, что вы пишете, является выражением. Самый простой, но наиболее точный способ определения выражения -« все, что имеет значение ».
«Когда вы набираете« $ a = 5 », вы назначаете« 5 »в $ a. '5', очевидно, имеет значение 5, или, другими словами,« 5 »является выражением"
http://php.net/manual/en/language.expressions.php
Теперь, когда вы читаете о переменной scope в руководстве, у них есть именно этот пример:
function test() { static $a = 0; echo $a; $a++; }
Итак, руководство по переменным областям говорит статическое значение $ a = 0; в то время как руководство по выражениям говорит, что $ a = 5, будет выражением. Это в основном одно и то же, всего лишь 0 вместо 5 …
Поэтому я немного смущен.
Что теперь представляет собой выражение, и что именно я могу или не могу назначить статическим переменным? 🙂
Вы не можете инициализировать static
переменную, используя не константное выражение. Вы можете назначить все, что вам нравится, после его инициализации.
Разница в том, что static
переменные инициализируются во время фазы синтаксического анализа, т. Е. В то время как PHP читает исходный код, чтобы выяснить, что к чему. На этом этапе код не выполняется, PHP просто читает, что вы хотите. Поэтому он не будет выполнять код для инициализации переменной.
static $foo = 'bar';
'bar'
– это постоянное значение, которое PHP может легко назначить переменной во время разбора.
static $foo = Bar::baz();
Bar::baz()
– это выражение, которое нужно запустить , PHP должен найти класс, загрузить его, если необходимо, запустить метод baz()
, который может делать всевозможные разные вещи … То же самое для 5 + 3
, md5('bar')
или все, что требует фактических вычислений. PHP просто не собирается делать все эти динамические материалы во время разбора. Поэтому вы не можете инициализировать static
переменную без каких-либо значений.
Во время выполнения вы можете назначить все, что вам нравится, для static
переменной. Часто используемым шаблоном является следующее:
static $foo = null; if ($foo === null) { $foo = new SomeObject; }
Это сохраняет экземпляр SomeObject
в static
переменной, но вы не можете инициализировать эту переменную.
static
ключевое слово ничего не меняет. 0
все еще является выражением.
Вы можете назначить статические только постоянные значения, которые определили значение на этапе синтаксического анализа и не имеют никаких вычислений.
Так
static $a = 0;
действительный код;
static $b = $a + 1; static $c = 1 + 5;
не.
Здесь вы перепутали яблоки и апельсины. (Или / и в руководстве было плохой труд, объясняющий их.)
Статические переменные, как и в вашем вопросе, не совпадают с статическими свойствами класса.