Недавно я просматривал часть своего кода и заметил, что в рассеянности я оставил структуру, подобную следующей:
$guid = empty($subscription->guid) ? : $subscription->guid;
Теперь, он не делал то, что предполагалось, и это неправильно , но, поскольку это свойство всегда установлено, теперь оно работало нормально, и с 5.3 не было синтаксической ошибки из-за следующего изменения :
Начиная с PHP 5.3, можно опустить среднюю часть троичного оператора. Выражение expr1?: Expr3 возвращает expr1, если expr1 оценивается как TRUE, и expr3 в противном случае.
Я не знал об этом изменении, и теперь мне любопытно, использовать его или нет. Это то , что я был совершенно отсутствует из языков , как рубин , где вы можете сделать , например, a = b || c
чтобы получить либо b
или c
вместо «реальной» булево. Однако синтаксис, который они выбрали для троичного оператора, кажется мне несколько противоречивым. Должен ли я использовать это в производственном коде? Это определенно бросилось, когда я увидел это случайно.
источник
Ответы:
Тройной условный оператор без второго аргумента немного романа, но он подобен 1 к нулевому-сливающихся оператору , найденному в другом Алголе-производных языках , таких как C # и Perl, и , как вы говорите, то
||
оператор в Ruby (и JavaScript).Поначалу это выглядит странно, но это не так уж и много (особенно если учесть прецедент для подобных операторов в других языках), и может сохранить много нажатий клавиш. И, если то, что произошло с разделителем пространства имен (
\
), является каким-либо указанием, странное синтаксис в конечном итоге будет принято сообществом PHP.Но одна из основных проблем, с которыми обычно сталкиваются PHP-приложения, - это (иногда) мучительно длительное время задержки между выпуском новой версии PHP и моментом, когда хосты начинают его поддерживать. Это приводит к проблемам, когда вам необходимо обеспечить обратную совместимость со старыми версиями PHP, отказываясь от использования таких удобных изменений, как этот.
Если это вас не беспокоит, и ваша команда согласна с его использованием (или если вы являетесь индивидуальным разработчиком, если вам это удобно), во что бы то ни стало, сделайте это. Как и разделитель пространства имен, я действительно думаю, что это действительно вопрос того, когда, а не если, это будет приемлемо во всех будущих проектах PHP.
Примечание 1 : Но не идентично, учитывая, что операторы с нулевым слиянием проверяют только ненулевые значения (а не истинные значения, такие как PHP), и
?:
синтаксис не подавляет неопределенные уведомления, как вы упоминали в комментариях .источник
@
чтобы скрыть уведомления о неопределенных вещах).Для меня это выглядит как ошибка в коде. Это выглядит неправильно, и в целом я избегаю использования синтаксиса, который выглядит так, будто вы допустили ошибку ради сохранения нескольких нажатий клавиш. Когда вы (или кто-то еще) вернетесь, чтобы прочитать код позже, я думаю, что эта строка сбивает вас с толку и заставляет вас тратить время на анализ того, что он делает, для того, что по сути является простой операцией.
источник
$foo = @$bar ?: 'baz'
эквивалентно$foo = (@$bar ? $bar : 'baz')
. Я согласен с вашими комментариями, хотя.Ну, PHP имеет логический тип, и
||
оператор возвращает логическое значение, поэтому в PHP результат$a || $b
является логическим, это согласуется с тем,&&
что&&
возвращать одно или другое бессмысленно, но имеет смысл возвращатьtrue
/false
. То, что все логические операторы возвращают bools, тоже звучит вполне логично.Кроме того, это не изобретение от PHP, а следование C, откуда берутся многие элементы дизайна «классического» PHP. Цитирование из §6.5.14 стандарта C99:
И, хорошо, где вы должны использовать?: Или нет, на него нельзя ответить в общем виде, но помните: лучший способ языка - использовать конструкции, которые он предоставляет, и использовать предлагаемые им парадигмы. Нет никакого смысла в написании Java-кода, такого как код на C или наоборот ;-)
источник
Я думаю, что это очень полезный оператор, и его обязательно следует использовать, так как языковой стандарт явно его определяет.
Обратите внимание, что он официально называется Elvis Operator в Grooy (почему? Просто посмотрите внимательно!), И было предложено ввести его в Java 7.
источник