Изучение OO-кодирования с помощью PHP, статические! = Выражения, но в руководстве PHP говорится, что все, что имеет значение, является выражением, смущенным

Я начал изучать 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; 

не.

Здесь вы перепутали яблоки и апельсины. (Или / и в руководстве было плохой труд, объясняющий их.)

Статические переменные, как и в вашем вопросе, не совпадают с статическими свойствами класса.

См .: http://php.net/manual/en/language.oop5.static.php