Я рассмотрел вопросы о тройных операторах и структурах if / else , и, хотя я понимаю, что при нормальных обстоятельствах нет потери / усиления производительности при использовании тернарных операторов над структурами if / else, я не видел упоминания об этом ситуация. Язык, специфичный для PHP (но приветствуются любые агностические данные языка) интерпретатор переназначает значения в таких ситуациях:
$foo = 'bar' $foo = strlen($foo) > 3 ? substr($foo, 0, 3) : $foo;
Поскольку это будет оцениваться до $foo = $foo;
это неэффективно, или интерпретатор просто пропускает / отказывается от этой оценки?
С одной стороны, как насчет:
!defined('SECURE') ? exit : null;
Я не знаю, является ли ваш первый пример неэффективным, но это абсолютно бессмысленно. Я все еще думаю, что утверждение if более ясное:
$foo = 'bar'; if (strlen($foo) > 3) $foo = substr($foo, 0, 3);
И хотя следующее работает, нет смысла помещать null
в конец, потому что троичный оператор предназначен для оценки выражений / значений, но здесь null
ничего не делает, кроме как предотвратить ошибку синтаксического анализа:
!defined('SECURE') ? exit : null;
Чаще всего вы увидите это, пример логического короткого замыкания ( or exit
не выполняется, если SECURE
определен, поскольку выражение or
условное выражение автоматически оценивается как true, по крайней мере одно условие считается истинным):
defined('SECURE') or exit;
То, что я пытаюсь сделать, заключается в следующем: не используйте тернарные условные выражения только потому, что можете.
В этом случае я использую форму, представленную BoltClock:
if (strlen($foo) > 3) { $foo = substr($foo, 0, 3); }
PHP не реализует в этом случае что-то более простое, но: /
Тема, в которой использование тернарной точки здесь не является оптимальной, уже рассмотрена выше. Я собираюсь ответить на ваш вопрос о том, переназначит ли это значение:
Это зависит от того, что вы называете «переназначением». PHP не оптимизируется, поэтому будет оцениваться $foo = $foo
. С другой стороны, это не заставит PHP скопировать значение $foo
в новый кусок памяти. Вероятно, PHP просто увеличит refcount
на $foo
а затем сразу уменьшит его (хотя я не уверен в точных деталях реализации самонаправления). Таким образом, даже если PHP выполнит оператор, это не повлияет на производительность (если вы не решите написать $foo = $foo
семь миллионов раз в вашем коде).
Всегда есть короткое замыкание, хотя, как сказал @BoltClock, утверждение if
вероятно, более читаемо, на мой взгляд, и открывает дверь в else if
и else
условия.
strlen($foo) > 3 && $foo = substr($foo, 0, 3);
Последний оператор будет выполнен только в том случае, если первый оценивает значение TRUE.