php: $ a = $ b ИЛИ $ a = $ c против троичного - PullRequest
3 голосов
/ 17 июня 2011

Мне нужно присвоить одну из двух переменных третьей переменной, используя значение второй переменной, если первой является (bool) false или undefined.

Обычно я делаю это с использованием троичной записи следующим образом:

$foobar = ($some_prefix_and_some_variable_name) ? $some_prefix_and_some_variable_name : $bar ; 

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

Мой вопрос сейчас, это простокак хорошо использовать эту запись:

$foobar = $some_prefix_and_some_variable_name OR $foobar = $bar;

и взаимозаменяемы ли эти записи с троичной версией?

Ответы [ 5 ]

7 голосов
/ 17 июня 2011

В PHP 5.3 также есть краткая троичная запись:

$foobar = $fooooooooooooooooooooooooo ?: $bar ;
5 голосов
/ 17 июня 2011

Потому что $foobar = $foo OR $foobar = $bar; оценивается следующим образом:

Назначить foo для foobar.
* Есть ли там значение?
* Если нет, назначьте bar для foobar.

В то время как другой оценивает:

Есть ли значение в foo?
* Если это так, назначьте foobar = foo
* иначе назначьте foobar = bar

В первом примере, если! Foo вы назначаете дважды, если foo это может быть быстрее. Во втором примере вы устанавливаете значение только один раз. Держу пари, что разница в скорости незначительна.

Большая проблема здесь - удобочитаемость. Если короткая нотация 5.3 недоступна, то я все равно буду использовать троичную нотацию хотя бы потому, что этого ожидают другие программисты.

В этом отношении вы сэкономите больше времени и денег, используя традиционный троичный синтаксис, хотя бы потому, что когда люди видят ваш код, они не будут спрашивать себя, WTF?

4 голосов
/ 17 июня 2011

Начиная с PHP 5.3 для этого есть специальный оператор:

$foobar = $fooooooooooooooooooooooooo ?: $bar;

Из документации по троичному оператору :

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

1 голос
/ 17 июня 2011

в зависимости от скорости, это:

$foobar = $fooooooooooooooooooooooooo OR $foobar = $bar;

это быстрее

0 голосов
/ 17 июня 2011

Нет. Я не знаю наверняка, являются ли эти два обозначения взаимозаменяемыми, что означает, что вы не должны использовать второе! Независимо от того, являются ли они на самом деле одинаковыми, если не сразу понятно, что делает код (как в этом случае), вы должны изменить его, если вы абсолютно не уверены, что больше никто не будет обновлять этот код. Если бы я увидел написанное, я не был бы уверен, должно ли это быть так, или там была какая-то опечатка, и ошибка просто никогда не обнаруживалась (видела ее слишком много раз!).

В идеале, с очень длинными именами переменных, вы должны сделать это:

if($fooooooooooooooooooooooooo){
    $foobar =$fooooooooooooooooooooooooo;
} else {
    $foobar = $bar;
}

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

...