Тернарные операторы и переменная переназначения в PHP

Я рассмотрел вопросы о тройных операторах и структурах 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.