2016-03-25 7 views
-1

$a = & $b;を含むコードスニペットが出現しましたが、$ bが実際に存在するかどうかはテストされていませんでした(if (isset($b)))。私はPHPがこれをどのように処理したか分からなかったので、素早く裸のテストをノックアップしました。今はもっと興味があります。PHP "Assign by reference"奇妙

$a = array('a'=>'b', 'x'=>'y'); 

$b = array(); 

$b[10] = &$a['a']; 
$b[11] = &$a['ppp']; 

var_dump($a); 
var_dump($b); 
echo (isset($a['ppp']) ? "SET" :" NOT SET") . "\n"; 
echo (isset($b[11]) ? "SET" :" NOT SET") . "\n"; 

それは裸のコードですが、どのような出力が示すことである:ちょうど$b[11] = &$a['ppp']の裸の割り当てが十分である

  • var_dump($a)は何の割り当てがために作られなかったにもかかわらず、3人のメンバーではない2を持つと報告され$a['ppp']$a['ppp']は値(NULL)を有すると報告されているが、isset()=FALSEも報告されている。

  • 。一方、同時に、$b[11]は値NULLisset()=FALSEを示してその参照(どうやら)存在しないにも関わらず(!)

私は最初の修正に「問題」をチェックすることを理解します、私は主に深い理解を探しています。何が起こっていますか?あなたは割り当て、パス、または参照によって未定義の変数を返す場合

+0

値が 'NOT NULL 'のときに設定されます –

+0

このシナリオに興味があるのなら、なぜあなたは議論に参加しませんか? –

答えて

0

説明は、それがを作成してしまいますこの

のと同じくらい簡単です。

(強調鉱山)何をやっているのです

。定義されていないインデックスを参照で割り当てて、作成します。同時に一方

、$ bの:未定義の変数

<?php 
function foo(&$var) { } 

foo($a); // $a is "created" and assigned to null 

$b = array(); 
foo($b['b']); 
var_dump(array_key_exists('b', $b)); // bool(true) 

$c = new StdClass; 
foo($c->d); 
var_dump(property_exists($c, 'd')); // bool(true) 
?> 

Example from PHP Manual

例1使用の参照はその後、別の質問を持っています[11]は値NULLを示し、isset()= FAL SEは、その参照は(明らかに)存在するにもかかわらず、また、手動

issetに明確に説明されて

(!) - 決定変数がを設定し、NULLでない場合

ISSET()

をNULLに設定された変数をテストする場合にはFALSEを返します

NULLなので、isset()はFALSEを返します。

0

スロットは、別の変数に別名を付けることができるようにする必要があります(これは実際にここで行われています。PHPの「参照」は実際には「参照」操作エイリアシングで置き換えられた通常の操作ですが、null以外の値を含む必要はなく、名前のいずれかを使用して値を割り当てるまで、値は含まれません。