Может кто-нибудь объяснить эту строку кода, пожалуйста? (Операторы логики и назначения) - PullRequest
1 голос
/ 14 ноября 2009

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

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

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

Я также видел код до того, как он выглядит примерно так:

$variable1 = $variable2 = $variable3;

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

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

Ответы [ 6 ]

5 голосов
/ 14 ноября 2009

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

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

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

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

$variable1 = $variable2 = $variable3;

В этом случае $variable2 устанавливается на значение $variable3 , затем $variable1 устанавливается на значение $variable2. Справочник php операторы присваивания страница охватывает это.

2 голосов
/ 14 ноября 2009
empty($user->profile) and $user->profile = new Profile();

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

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

1 голос
/ 14 ноября 2009

Это в основном так же, как

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

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

0 голосов
/ 14 ноября 2009
$variable1 = $variable2 = $variable3;

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

0 голосов
/ 14 ноября 2009

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

Как если бы я написал:

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

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

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

или

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

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

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

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

0 голосов
/ 14 ноября 2009

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

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

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