Пропуск второй части троичного оператора

#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();