Я видел следующие строки кода, и я знаю, что они делают, но я не знаю, как работает вторая строка (и, следовательно, как применить ее к другой ситуации).
$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 делает некоторые очень приятные вещи с выражениями, которые действительно полезны для изучения. Посмотрите эту ссылку для получения дополнительной информации:
$variable1 = $variable2 = $variable3;
Присвоение (через знак равенства) в PHP имеет право налево. Каждое выражение в PHP имеет возвращаемое значение. Таким образом, возвращаемое значение выражения $variable3
присваивается $variable2
. Затем возвращаемое значение выражения $variable2 = $variable3
присваивается $variable1
.