Сокращенный тернарный оператор PHP ?: Неожиданная ошибка синтаксического анализа:

Я только что загрузил несколько старых файлов PHP на новый сервер и получаю ошибки синтаксического анализа (неожиданные ':') в сокращенных троичных операциях. например:

$y = $x ?: "Some default";

Версия php — 5.2.16. Код изобилует этими сокращениями ?:, поэтому, прежде чем менять их все, я подумал, что посмотрю, знает ли кто-нибудь что-нибудь об этом, поскольку я некоторое время не использовал PHP.


person Paul Kersey    schedule 08.06.2011    source источник
comment
старые файлы PHP на новый сервер - я думаю, вы имеете в виду новые файлы PHP на старый сервер! (Используемый здесь синтаксис PHP новее, чем версия PHP, установленная на вашем (старом) сервере.)   -  person MrWhite    schedule 19.01.2018
comment
Почему все называют это выражение тернарным оператором? Требуется всего два аргумента. Разве это не оператор Элвиса?   -  person ya.teck    schedule 16.03.2021


Ответы (2)


Это доступно только с PHP 5.3.

Выражение (expr1) ? (expr2) : (expr3) оценивается как expr2, если expr1 оценивается как TRUE, и expr3, если expr1 оценивается как FALSE.

Начиная с PHP 5.3, можно опустить среднюю часть тернарного оператора. Выражение expr1 ?: expr3 возвращает expr1, если expr1 принимает значение TRUE, и expr3 в противном случае.1

См. этот пример для получения дополнительной информации.

или более полезный, но обратите внимание в комментариях: http://www.php.net/manual/en/control-structures.if.php#102060


1http://php.net/manual/en/language.operators.comparison.php

person azat    schedule 08.06.2011
comment
Неправильно, я использую PHP 5.2.x, и он работает нормально. Смотрите ответ Nightwolf ниже... - person philm; 08.06.2011
comment
Нет, это cant be PHP 5.2.x. Maybe in your PHP version work this $a = $foo ? 'foo' : 'бар'` ? - person azat; 08.06.2011
comment
Сокращение для PHP 5.2.x требует пустого значения, как в моем ответе ниже, но приведенное выше должно нормально работать в PHP 5.3. - person Nightwolf; 08.06.2011
comment
(Для гуглеров, которые торопятся: philm и Nightwolf были неправы, а руководство по PHP было правильным. ;) Nightwolf в конце концов поправился в своем ответе или ниже.) - person Sz.; 21.02.2018
comment
Я хотел бы добавить следующее: если expr1 оценивается как true, возвращается результат этой оценки. Другими словами, если expr1 истинно, оно не будет оцениваться снова, но результат выражения будет использоваться так же, как и при первом вычислении. - person XedinUnknown; 12.06.2018

Поскольку вы используете php 5.2.16, для вашего троичного кода требуется 2 параметра, например

$y = $x? "???" : "Some default";

Переменная = условие? истинное значение: ложное значение;

person Nightwolf    schedule 08.06.2011
comment
PHP 5.2.x требует этого синтаксиса, но исходный синтаксис вопроса отлично работает в 5.3. - person Nightwolf; 08.06.2011
comment
Это не правильно. Является ли это сокращенной тройкой или эквивалентом того, что хочет пользователь. Эквивалентом в PHP 5.2 будет $y = $x ? $x : 'default';. - person igorw; 09.06.2011
comment
@igorw: я сказал пользователю, почему он получает ошибку, только для того, чтобы он научился, а не слепо копировал код. - person Nightwolf; 10.06.2011
comment
Повторюсь, сокращение ?: доступно только в 5.3+. - person John Carter; 25.09.2012
comment
@Nightwolf это не сокращение, это полный тернарный оператор. Кажется, вы запутались, потому что тернарный оператор сам по себе является короткой версией if/else, но этот вопрос касается сокращенного тернарного оператора, а вы просто говорите о стандартном тернарном операторе. Извините, что обращаюсь к такому старому ответу, но, похоже, в то время никому не удалось прояснить ваше замешательство. - person Niall; 20.01.2014
comment
@Niall Когда я писал ответ, я только знал и подтверждал требования сокращенного if/else в этой версии php и считал, что это называется стенографией. Изменено, чтобы сказать троичный вместо стенографии. - person Nightwolf; 21.01.2014