#php #conditional-operator
#php #условный оператор
Вопрос:
Учитывая следующее выражение:
$att['menutext'] = isset($attrib_in['i_menu_text']) ? : $this->getID();
Если он принимает значение true, $att['menutext']
будет установлено значение true
или $this->getID()
?
Комментарии:
1. Это не будет выполнено, это недопустимый синтаксис.
Parse error: syntax error, unexpected ':' on line X
2. Не в PHP 5.3. php.net/manual/en /…
3. Это объясняет, почему это не сработало в версии 5.2.5 🙂
Ответ №1:
Согласно этой ссылке:
Начиная с PHP 5.3, можно опустить среднюю часть троичного оператора. Выражение expr1 ?: expr3 возвращает expr1, если значение expr1 равно TRUE, и expr3 в противном случае.
Ответ №2:
Да, в версии 5.3 среднее выражение является необязательным и возвращает true.
$a = (true ? : 1); // $a evaluates to true.
$a = (false ? : 1); // $a evaluates to 1.
Комментарии:
1. Просто чтобы пояснить для прохожих, эта сокращенная версия тернарного оператора возвращает все, что вычисляет условие, а не только логическое
true
значение в каждом экземпляре. В этом случае условие будет оцениваться какtrue
. Но если бы у вас был$foo = 42 ? : false;
,$foo
был бы назначен42
.2. Есть ли способ использовать первое выражение как результат второго или третьего? Нравится
$db->get('id', 'users', 'id', $id) ? previous_query : anything_else
. Теперь вам нужно написать$db->get('id', 'users', 'id', $id) ? $db->get('id', 'users', 'id', $id) : anything_else
. Который выполняет два запроса к базе данных. Вы могли бы сохранить его в vars до этого, но это совсем не то, что я имею в виду. Невозможно?
Ответ №3:
Это точно так же, как следующее
$att['menutext'] = isset($attrib_in['i_menu_text']) ? true : $this->getID();
Комментарии:
1. Просто чтобы пояснить для прохожих, эта сокращенная версия тернарного оператора возвращает все, что вычисляет условие, а не только логическое
true
значение в каждом экземпляре. В этом случае условие будет оцениваться какtrue
. Но если бы у вас был$foo = 42 ? : false;
,$foo
был бы назначен42
.2. Я особенно впечатлен тем фактом, что этот ответ и комментарий фактически ответили на вопрос, который я хотел задать, а также на тот, который я задал
3. Этот ответ неверен, в нем нет
isset
подразумеваемого.
Ответ №4:
никогда не тестировался ранее, но его довольно легко протестировать:
<?php var_dump(TRUE ? : 'F'); ?>
и в нем написано: bool(true)
Ответ №5:
Это не будет выполнено, это недопустимый синтаксис для PHP < 5.3.
Parse error: syntax error, unexpected ':' on line X
Если вы хотите, чтобы значение было установлено в true, тогда используйте true:
$att['menutext'] = isset($attrib_in['i_menu_text']) ? true : $this->getID();
Или, может быть, более вероятно, что вы хотите:
$att['menutext'] = isset($attrib_in['i_menu_text']) ? $attrib_in['i_menu_text'] : $this->getID();