24

簡単な質問、簡単なコード。これは機能します:

$x = &$_SESSION['foo'];

これはしません:

$x = (isset($_SESSION['foo']))?&$_SESSION['foo']:false;

投げPHP Parse error: syntax error, unexpected '&'ます。条件演算子を使用しているときに参照渡しができないのはなぜですか? ?との間にスペースがある場合にも発生し&ます。

4

5 に答える 5

22

非常に単純なケースでは、この式は違法です。

$c = condition ? &$a : &$b; // Syntax error

次のように記述できます。

$c = &${ condition ? 'a' : 'b' };

特定のケースでは、条件がfalseの場合は参照によって割り当てていないため、より良いオプションは次のようです:

$x = isset($_SESSION['foo']) ? $x = &$_SESSION['foo'] : false;
于 2011-02-02T09:04:08.277 に答える
17

簡単な答え:いいえ。if/elseを使用する場合は長い道のりをたどる必要があります。また、ある時点で参照を持ち、次の時点で値を持つことはまれであり、混乱を招く可能性があります。これはもっと直感的だと思いますが、もちろんあなたのコードはわかりません。

if(!isset($_SESSION['foo'])) $_SESSION['foo'] = false;
$x = &$_SESSION['foo'];

理由について:わかりません。おそらく、パーサーが何かを値のコピーまたは参照の作成と見なす必要があります。このように、解析の時点では決定できません。

于 2010-08-02T16:57:19.563 に答える
3

やってみよう:

$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 4
b:
(refcount=1, is_ref=0) ,null

于 2010-08-02T17:23:33.163 に答える
2

残念ながら、できません。

$x=false;
if (isset($_SESSION['foo']))
   $x=&$_SESSION['foo'];
于 2010-08-02T16:59:03.073 に答える
0


http://bugs.php.net/bug.php?id=53117のこのバグ レポートの解説で、この問題が明らかになるかもしれません。

基本的に、三項演算子の結果から参照を割り当てようとする際の 2 つの問題は次のとおりです。

  1. 式は参照を生成できません。
  2. $x = (expression)が参照であっても、参照代入で(expression)はありません (そうではありません。ポイント 1 を参照してください)。
于 2011-05-19T02:47:40.760 に答える