簡単な質問、簡単なコード。これは機能します:
$x = &$_SESSION['foo'];
これはしません:
$x = (isset($_SESSION['foo']))?&$_SESSION['foo']:false;
投げPHP Parse error: syntax error, unexpected '&'
ます。条件演算子を使用しているときに参照渡しができないのはなぜですか? ?
との間にスペースがある場合にも発生し&
ます。
簡単な質問、簡単なコード。これは機能します:
$x = &$_SESSION['foo'];
これはしません:
$x = (isset($_SESSION['foo']))?&$_SESSION['foo']:false;
投げPHP Parse error: syntax error, unexpected '&'
ます。条件演算子を使用しているときに参照渡しができないのはなぜですか? ?
との間にスペースがある場合にも発生し&
ます。
非常に単純なケースでは、この式は違法です。
$c = condition ? &$a : &$b; // Syntax error
次のように記述できます。
$c = &${ condition ? 'a' : 'b' };
特定のケースでは、条件がfalseの場合は参照によって割り当てていないため、より良いオプションは次のようです:
$x = isset($_SESSION['foo']) ? $x = &$_SESSION['foo'] : false;
簡単な答え:いいえ。if/elseを使用する場合は長い道のりをたどる必要があります。また、ある時点で参照を持ち、次の時点で値を持つことはまれであり、混乱を招く可能性があります。これはもっと直感的だと思いますが、もちろんあなたのコードはわかりません。
if(!isset($_SESSION['foo'])) $_SESSION['foo'] = false;
$x = &$_SESSION['foo'];
理由について:わかりません。おそらく、パーサーが何かを値のコピーまたは参照の作成と見なす必要があります。このように、解析の時点では決定できません。
やってみよう:
$x =& true?$y:$x;
解析エラー: 構文エラー、予期しない '?'、T_PAAMAYIM_NEKUDOTAYIM を期待しています...
$x = true?&$y:&$x;
解析エラー: 構文エラー、予期しない '&' が...
つまり、解析すらしていません。許可されない理由については、おそらく Wikken が正しいでしょう。
関数を使用してこれを回避できます。
function &ternaryRef($cond, &$iftrue, &$iffalse=NULL) {
if ($cond)
return $iftrue;
else
return $iffalse;
}
$x = 4;
$a = &ternaryRef(true, $x);
xdebug_debug_zval('a');
$b = &ternaryRef(false, $x);
xdebug_debug_zval('b');
与えます:
あ:
(refcount=2, is_ref=1) ,int 4b:
(refcount=1, is_ref=0) ,null
残念ながら、できません。
$x=false;
if (isset($_SESSION['foo']))
$x=&$_SESSION['foo'];
http://bugs.php.net/bug.php?id=53117のこのバグ レポートの解説で、この問題が明らかになるかもしれません。
基本的に、三項演算子の結果から参照を割り当てようとする際の 2 つの問題は次のとおりです。
$x = (expression)
が参照であっても、参照代入で(expression)
はありません (そうではありません。ポイント 1 を参照してください)。