Использование тернарного оператора PHP только с двумя аргументами

9

Недавно я просматривал часть своего кода и заметил, что в рассеянности я оставил структуру, подобную следующей:

$guid = empty($subscription->guid) ?  : $subscription->guid;

Теперь, он не делал то, что предполагалось, и это неправильно , но, поскольку это свойство всегда установлено, теперь оно работало нормально, и с 5.3 не было синтаксической ошибки из-за следующего изменения :

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

Я не знал об этом изменении, и теперь мне любопытно, использовать его или нет. Это то , что я был совершенно отсутствует из языков , как рубин , где вы можете сделать , например, a = b || cчтобы получить либо bили cвместо «реальной» булево. Однако синтаксис, который они выбрали для троичного оператора, кажется мне несколько противоречивым. Должен ли я использовать это в производственном коде? Это определенно бросилось, когда я увидел это случайно.

Мэтью Шарли
источник
Вы должны использовать нулевой оператор объединения для этого Varsolp techflirt.com/null-coalescing-operator-php
Кумар Сингх

Ответы:

7

Тройной условный оператор без второго аргумента немного романа, но он подобен 1 к нулевому-сливающихся оператору , найденному в другом Алголе-производных языках , таких как C # и Perl, и , как вы говорите, то ||оператор в Ruby (и JavaScript).

Поначалу это выглядит странно, но это не так уж и много (особенно если учесть прецедент для подобных операторов в других языках), и может сохранить много нажатий клавиш. И, если то, что произошло с разделителем пространства имен ( \), является каким-либо указанием, странное синтаксис в конечном итоге будет принято сообществом PHP.

Но одна из основных проблем, с которыми обычно сталкиваются PHP-приложения, - это (иногда) мучительно длительное время задержки между выпуском новой версии PHP и моментом, когда хосты начинают его поддерживать. Это приводит к проблемам, когда вам необходимо обеспечить обратную совместимость со старыми версиями PHP, отказываясь от использования таких удобных изменений, как этот.

Если это вас не беспокоит, и ваша команда согласна с его использованием (или если вы являетесь индивидуальным разработчиком, если вам это удобно), во что бы то ни стало, сделайте это. Как и разделитель пространства имен, я действительно думаю, что это действительно вопрос того, когда, а не если, это будет приемлемо во всех будущих проектах PHP.


Примечание 1 : Но не идентично, учитывая, что операторы с нулевым слиянием проверяют только ненулевые значения (а не истинные значения, такие как PHP), и ?:синтаксис не подавляет неопределенные уведомления, как вы упоминали в комментариях .

Сообщество
источник
На данный момент моя «команда» состоит исключительно из меня. Хостинг не является проблемой, так как мы обычно размещаем 98% сайтов, которые мы создаем, и мы размещаем поверх 5.3.6. Я понимаю, что сама функциональность не так уж необычна, просто синтаксис для нее был корнем моего вопроса. Есть также проблема, когда он не действует как оператор с нулевым слиянием без дополнительного синтаксиса ( @чтобы скрыть уведомления о неопределенных вещах).
Мэтью Шарли
3
@MatthewScharley Если разгром разделителя пространства имен (\) является какой-либо индикацией, странный синтаксис не является препятствием для широкого распространения в PHP. Это действительно сводится к тому, когда, а не если, вы должны начать использовать его.
3

Для меня это выглядит как ошибка в коде. Это выглядит неправильно, и в целом я избегаю использования синтаксиса, который выглядит так, будто вы допустили ошибку ради сохранения нескольких нажатий клавиш. Когда вы (или кто-то еще) вернетесь, чтобы прочитать код позже, я думаю, что эта строка сбивает вас с толку и заставляет вас тратить время на анализ того, что он делает, для того, что по сути является простой операцией.

MattBelanger
источник
Приведенный пример неверен . Правильное использование функциональности по назначению будет $foo = @$bar ?: 'baz'эквивалентно $foo = (@$bar ? $bar : 'baz'). Я согласен с вашими комментариями, хотя.
Мэтью Шарли
1

Ну, PHP имеет логический тип, и ||оператор возвращает логическое значение, поэтому в PHP результат $a || $bявляется логическим, это согласуется с тем, &&что &&возвращать одно или другое бессмысленно, но имеет смысл возвращать true/ false. То, что все логические операторы возвращают bools, тоже звучит вполне логично.

Кроме того, это не изобретение от PHP, а следование C, откуда берутся многие элементы дизайна «классического» PHP. Цитирование из §6.5.14 стандарта C99:

|| оператор должен выдавать 1, если один из его операндов сравнивается с 0; в противном случае он возвращает 0. Результат имеет тип int.

И, хорошо, где вы должны использовать?: Или нет, на него нельзя ответить в общем виде, но помните: лучший способ языка - использовать конструкции, которые он предоставляет, и использовать предлагаемые им парадигмы. Нет никакого смысла в написании Java-кода, такого как код на C или наоборот ;-)

Johannes
источник
0

Я думаю, что это очень полезный оператор, и его обязательно следует использовать, так как языковой стандарт явно его определяет.

Обратите внимание, что он официально называется Elvis Operator в Grooy (почему? Просто посмотрите внимательно!), И было предложено ввести его в Java 7.

Майкл Боргвардт
источник