Назначение переменных по ссылке и тернарному оператору? - PullRequest
6 голосов
/ 18 декабря 2011

Почему троичный оператор не работает с присваиванием по ссылке?

$obj     = new stdClass(); // Object to add
$result  = true; // Op result
$success = array(); // Destination array for success
$errors  = array(); // Destination array for errors

// Working
$target = &$success;
if(!$result) $target = &errors;
array_push($target, $obj);

// Not working
$target = $result ? &$success : &$errors;
array_push($target, $obj);

1 Ответ

6 голосов
/ 18 декабря 2011

Вот, пожалуйста,

$target = ($result ? &$success : &$errors);

Также в вашем примере есть две опечатки


редактировать

http://php.net/manual/en/language.operators.comparison.php

Примечание: обратите внимание, что троичный оператор является выражением и что он вычисляет не переменную, а результат выражения. Это важно знать, если вы хотите вернуть переменную по ссылке. Утверждение возврата $ var == 42? $ a: $ b; поэтому функция возврата по ссылке не будет работать, и в более поздних версиях PHP выдается предупреждение.

idk, если раньше это работало, но больше нет. если вы не хотите использовать оператор if, попробуйте следующее:

$result ? $target = &$success : $target = &$errors;

или на разделенных линиях ...

$result 
  ? $target = &$success 
  : $target = &$errors;
...