Приоритет оператора в PHP: троичное назначение XOR - PullRequest
1 голос
/ 16 июля 2010

После написания моего ответа на вопрос как назначить несколько переменных в троичном операторе Я на самом деле опробовал код, который я написал:

true ? $w = 100 xor $r = 200 : $w = 300 xor $r = 400;
var_dump($w); var_dump($r);

(Не беспокойтесь, этобесполезно, это теоретически.)

Теперь я бы ожидал, что PHP будет делать это таким образом, в соответствии с приоритетом оператора :

 true  ?   $w = 100  xor  $r = 200   :   $w = 300  xor  $r = 400  ;
(true) ? ( $w = 100  xor  $r = 200 ) : ( $w = 300  xor  $r = 400 );
(true) ? (($w = 100) xor ($r = 200)) : (($w = 300) xor ($r = 400));

В качестве первой частитроичный оператор вычисляется, это должно вывести:

int 100
int 200

Но вместо этого я получаю

int 100
int 400

Это очень странно для меня, потому что это потребовало бы, чтобы части обачасти троичного оператора выполняются.

Предположим, это какая-то ошибка в моем мышлении.

Ответы [ 2 ]

4 голосов
/ 16 июля 2010

ты просто не делаешь

(true ? $w = 100 xor $r = 200 : $w = 300) xor $r = 400;
3 голосов
/ 16 июля 2010

Я бы вообще не использовал троичный оператор таким образом.Используйте троичный оператор, когда вам нужно, чтобы целое выражение возвращало значение, а не в качестве замены конструкций логического кода.

Например:

if (true) {
  $w = 100;
  $r = 200;
} else {
  $w = 300;
  $r = 400;
}

var_dump($w); 
var_dump($r);

Преимущества использования конструкции if / else:

  • Легче читать, легче обслуживать, легче отлаживать.
  • Легче добавлять больше шагов в каждый условный блок при необходимости.
  • Если вы запуститетестируя с использованием инструментов покрытия кода, вы получите более точное представление о том, какие пути кода тестируются, когда весь ваш код не находится в одной строке.
  • Вам не нужно отправлять вопрос в Stack Overflow, чтобы он заработал!

Преимущества использования троичного оператора:

  • Использует меньше фигурных- скобки и точки с запятой, если у вас закончились или вы не можете найти их на клавиатуре.
...