Может кто-нибудь объяснить эту строку кода, пожалуйста? (Операторы логики и присваивания)

Я видел следующие строки кода, и я знаю, что они делают, но я не знаю, как работает вторая строка (и, следовательно, как применить ее к другой ситуации).

$user = User::model()->findByPk(123); empty($user->profile) and $user->profile = new Profile(); 

Код пытается найти пользователя из базы данных, а если нет профиля, создается новое для использования позже.

Я также видел код, прежде чем что-то вроде следующего:

 $variable1 = $variable2 = $variable3; 

Он сделал что-то более сложное, чем просто назначение трех вещей одинаковым, но я не могу найти этот тип вещей, чтобы узнать какую-либо информацию об этом, не говоря уже о том, чтобы найти исходный код, с которым я столкнулся. Я думаю, что изначально у него было «и». Кто-нибудь знает, как искать код, в котором есть более одного знака равенства, который был не просто выражением if?

Извините за два вопроса в одном (и расплывчатый в этом) и ужасный заголовок (я исправлю это, когда узнаю имена, если это что-то вроде теневого заявления)).

Использование логических операторов для пропуска кода : поскольку php оценивает строку с оператором AND, если первая часть является ложной, вторая часть не оценивается, так как она не изменит результат.

Поэтому в этом случае, если empty() возвращает true, то php оценивает правую сторону. Если empty() возвращает false, больше не выполняется оценка и профиль не выполняется.

На странице справочных логических операторов php есть некоторые иллюстрации этого.

Операторы с несколькими присваиваниями : оператор присваивания присваивает правильное выражение переменной слева.

 $variable1 = $variable2 = $variable3; 

В этом случае $variable2 устанавливается на значение $variable3 тогда $variable1 устанавливается на значение $variable2 . На этой странице описывается страница операторов ручного задания php.

 empty($user->profile) and $user->profile = new Profile(); 

in and statement, сначала оценивается первый элемент; если это правда, то второй оператор оценивается, простое присваивание всегда должно оцениваться как истинное, я полагаю. если первый элемент был ложным, второй элемент не оценивается.

Вы можете больше узнать о приоритете оператора в php docs.

Это в основном то же самое, что и

 if (empty($user->profile)) $user->profile = new Profile(); 

Действительно странный синтаксис …

То, что вы видите, используется на многих языках. Вот статья для его использования в JavaScript … но она хорошо объясняет концепцию.

http://css.dzone.com/articles/guard-and-default-operators-ja

Это довольно странный способ написать это. С выражением PHP, если первая часть оценивает значение false, выражение прекратит рендеринг.

Например, если я пишу:

 if (x == 5 and y == 2) 

который будет проверять, если x == 5, то, если это произойдет, он будет проверять, если y == 2. Если x! = 5, он никогда не будет проверять y == 2. Поэтому приведенный выше код использует этот факт, чтобы проверить, пуст ли файл $ user->. Тогда, если это так, он выполняет следующую часть выражения, которая представляет собой назначение $ user-> profile = new Profile (); В основном то же самое, что:

 if (empty($user->profile)) $user->profile = new Profile(); 

или

 empty($user->profile) ? $user->profile = new Profile(); 

Что касается вашего второго вопроса, оператор = является просто назначением, поэтому это означает, что значение переменной $ переменной1 будет установлено в значение переменной $ переменной2, которая будет установлена ​​в значение переменной $ variable3.

PHP делает некоторые очень приятные вещи с выражениями, которые действительно полезны для изучения. Посмотрите эту ссылку для получения дополнительной информации:

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

 $variable1 = $variable2 = $variable3; 

Присвоение (через знак равенства) в PHP имеет право налево. Каждое выражение в PHP имеет возвращаемое значение. Таким образом, возвращаемое значение выражения $variable3 присваивается $variable2 . Затем возвращаемое значение выражения $variable2 = $variable3 присваивается $variable1 .