Тернарные операторы и переназначение переменных в PHP - PullRequest
0 голосов
/ 09 января 2011

Я изучил вопросы по троичным операторам против , если / else структурирует , и хотя я понимаю, что при нормальных обстоятельствах при использовании троичных операторов не происходит потери / выигрыша в производительностинад структурами if / else я не видел упоминаний об этой ситуации.Язык, специфичный для PHP (но приветствуются любые независимые от языка подробности), переводчик переназначает значения в ситуациях, подобных этой:

$foo = 'bar'
$foo = strlen($foo) > 3 ? substr($foo, 0, 3) : $foo;

Так как это оценивается как $foo = $foo;, это неэффективно, или интерпретатор просто пропускает/ отменить эту оценку?

Что касается:

!defined('SECURE') ? exit : null;

Ответы [ 4 ]

4 голосов
/ 09 января 2011

Я не знаю, является ли ваш первый пример неэффективным, но он, безусловно, бессмыслен. Я все еще думаю, что утверждение 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;

Я хочу подчеркнуть следующее: не используйте троичные условные выражения только потому, что вы можете.

0 голосов
/ 10 января 2011

Всегда существует короткое замыкание, хотя, как сказал @BoltClock, оператор if, вероятно, более читабелен, на мой взгляд, и открывает дверь для условий else if и else.

strlen($foo) > 3 && $foo = substr($foo, 0, 3); 

Последний оператор будет выполняться только в том случае, если первый оператор имеет значение ИСТИНА.

0 голосов
/ 10 января 2011

Тема о том, что использование троичного здесь не является оптимальным, уже была рассмотрена выше. Я собираюсь ответить на ваш вопрос о том, будет ли присвоено значение:

Это зависит от того, что вы называете «переназначением». PHP не оптимизирует, поэтому $foo = $foo будет оцениваться. С другой стороны, это не заставит PHP скопировать значение $foo в новый фрагмент памяти. Вероятно, PHP просто увеличит refcount на $foo, а затем сразу же уменьшит его (хотя я не уверен насчет точных деталей реализации самостоятельного назначения). Таким образом, даже если PHP выполнит оператор, это не повлияет на производительность (если вы не решите написать $foo = $foo семь миллионов раз в вашем коде).

0 голосов
/ 10 января 2011

В этом случае я использую форму, представленную BoltClock:

if (strlen($foo) > 3) {
    $foo = substr($foo, 0, 3);
}

PHP не реализует что-то более простое для работы в этих случаях, однако: /

...