Изучение ОО-программирования на PHP, статические выражения! =, Но в руководстве по PHP сказано, что все, что имеет значение, является выражением - PullRequest
3 голосов
/ 27 января 2012

Я начал изучать ОО несколько дней назад, я вполне в порядке с процедурным кодированием, но, очевидно, этого недостаточно, и я хочу стать хорошо осведомленным программистом с большим опытом и знаниями, поэтому прежде всего нужно полностью изучитьДолжно быть, ОО, за которым следуют правильные шаблоны проектирования.

Во всяком случае, у меня есть одна вещь, в которой я застрял, которой я не совсем следую ...

Статические переменные ...Я понимаю, что статическая переменная не теряет своего значения, даже если содержащая функция завершена, и сохраняет свое значение, если та же функция выполняется снова, снова и т. Д. И т. Д.

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

Итак, я прочитал руководство по PHP, чтобы выяснить, что именно считается выражением?Ответ руководства (и я цитирую):

"В PHP почти все, что вы пишете, является выражением. Самый простой, но самый точный способ определить выражение - это" все, что имеет значение "."

"Когда вы набираете« $ a = 5 », вы присваиваете« 5 »в $ a.« 5 », очевидно, имеет значение 5, или, другими словами,« 5 »является выражением»

http://php.net/manual/en/language.expressions.php

Теперь, когда вы читаете о области действия переменной в руководстве, у них есть именно такой пример:

    function test()
    {
    static $a = 0;
    echo $a;
    $a++;
    }

Итак, в руководстве по областям действия переменной указано static $ a= 0;хорошо, в то время как руководство по выражениям говорит, что $ a = 5, было бы выражением.По сути, это одно и то же, просто 0 вместо 5 ...

Так что я сейчас немного растерялся.

Что такое выражение сейчас, и что именно я могу илия не могу назначить статические переменные?:)

Ответы [ 3 ]

7 голосов
/ 27 января 2012

Вы не можете инициализировать переменную 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, но вы не можете инициализировать переменную с ним.

2 голосов
/ 27 января 2012

static ключевое слово ничего не меняет. 0 все еще является выражением.

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

So

static $a = 0;

является действующим кодом;

static $b = $a + 1;
static $c = 1 + 5;

нет.

0 голосов
/ 27 января 2012

Вы перепутали яблоки и апельсины здесь. (Или / и руководство плохо объяснило их.)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...