Використання потрійного оператора PHP лише з двома аргументами


9

Нещодавно я переглядав деякі свої коди і помітив, що в розпалі бездуховності я покинув структуру на зразок наступної:

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

Тепер це не робило те, що належить, і це неправильно , але оскільки це властивість завжди встановлено, воно працювало нормально, і не виникає помилок синтаксису з 5.3 через наступні зміни :

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

Я не знав про цю зміну, і зараз мені цікаво, чи варто її використовувати чи ні. Це те, що мені дуже не вистачало з таких мов, як рубін, де ви можете зробити, наприклад, a = b || cотримати bабо, cа не «справжній» булевий. Однак синтаксис, який вони вибрали для потрійного оператора, здається мені трохи протиінтуїтивним. Чи слід використовувати це у виробничому коді? Це безумовно кинулося, коли я побачив це випадково.


Вам слід скористатися оператором нульового згортання
Ankur Kumar Singh

Відповіді:


7

Потрійний умовний оператор без другого аргументу є трохи новим, але він схожий на 1 зв'язаний з нулем оператор, який можна знайти в інших мовах похідних Algol, таких як C # і Perl, і, як ви згадуєте, ||оператор у Ruby (та JavaScript).

Спочатку це виглядає дивно, але це не надто там (тим більше, що є прецедент для подібних операторів на інших мовах), і може врятувати багато натискань клавіш. І якщо те, що сталося з роздільником простору імен ( \), є будь-якими ознаками, дивні синтаксиси з часом будуть прийняті спільнотою PHP.

Але однією з найважливіших проблем, з якою стикаються програми PHP, є (іноді) неприємно довгий час затримки між випуском нової версії PHP та коли хости починають її підтримувати. Це призводить до проблем, коли вам потрібно бути назад сумісними з більш старими версіями PHP, відмовляючись від використання зручностей, таких як ця.

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


Примітка 1 : Але не ідентично, дані оператори, що поєднують з нулем, перевіряють лише ненульові значення (а не триєдні значення, такі як PHP), і ?:синтаксис не пригнічує невизначені сповіщення, як ви згадували в коментарях .


Наразі моя «команда» складається виключно з мене. Хостинг не є проблемою, оскільки ми, як правило, розміщуємо 98% сайтів, які ми створюємо, а ми розміщуємо поверх 5.3.6. Я усвідомлюю, що функціональність сама по собі не настільки незвичайна, просто синтаксис для неї, що був коренем мого питання. Існує також проблема, коли він не діє як оператор, що поєднує null, без більшого синтаксису ( @щоб приховати повідомлення про невизначені речі).
Меттью Шарлі

3
@MatthewScharley Якщо дебалекс простору імен (\) є вказівкою, дивний синтаксис не є перешкодою для широкого прийняття в PHP. Це дійсно зводиться до того, коли, якщо не, ви повинні почати його використовувати.

3

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


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

1

Ну, PHP має булевий тип, і ||оператор повертає булевий, тому в PHP результатом $a || $bє булеве, це узгоджується з тим, &&як з &&цим мало сенсу повертати те чи інше, але має сенс повертатися true/ false. Досягнення всіх булевих операторів повернення булів також звучить цілком логічно.

Крім того, це не винахід від PHP, а слідом за C, звідки походить багато елементів дизайну "класичного" PHP. Цитуючи §6.5.14 стандарту C99:

|| оператор повинен отримати 1, якщо будь-який з його операндів порівняти нерівне з 0; в іншому випадку він дає 0. Результат має тип int.

І, ну, що вам слід використовувати? Мало сенсу писати Java-код, наприклад, код C або навпаки ;-)


0

Я думаю, що це дуже корисний оператор, і його обов'язково слід використовувати, оскільки мовний стандарт прямо визначає його.

Зауважте, що його офіційно називають оператором Elvis в Grooy (чому? Просто придивіться до нього уважно!), І було запропоновано його впровадити в Java 7.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.