2013-12-17 12 views
8

I次のコードスニペットがあります最初の呼び出しでE_NOTICEエラーが発生しないのはなぜですか?

error_reporting(E_ALL | E_STRICT); 

    function &getVal() { 
     $data = []; 

     return $data['hey']; 
     //return $whatever; 
    } 

    function getVal2() { 
     $data = []; 

     return $data['hey']; 
    } 

    var_dump(getVal()); // No E_NOTICE error is issued - why? 
    var_dump(getVal2()); // E_NOTICE error is issued. 

をし、問題がある:最初の呼び出しにはE_NOTICEエラーがないのはなぜ?説明は、参照を返すために変数$data['hey']が作成されている可能性が最も高いです。ただし、$data['hey'](または$whatever,...)が定義されていない場合、E_NOTICEエラーを発行しないようにするのは間違いです。

+0

あなた自身で質問に答えました。 "間違っているように" ...これはPHPですよね? – Jon

+1

まあ、あなたは絶対に正しいです。問題は、それを参照するという単なる動作によってインスタンス化されたことです。これはおそらく 'preg_match( '..'、 '..'、$ match);を呼び出すように、参照がどのようにしてフードの中で扱われるかと関係しています;'もちろん '$ match'については不平を言いませんまだ、ポイントはそれを埋めるように。 _returnを参照してください。「この場所で_and_request_ dataにアクセスしてください。」と表示されます。スコープの終了時に戻り値の直後に変数を破棄すると、ポイントの横に表示されます。私はそれがとてもかわいいと言っているわけではないが、それはどのようなものなのか。 – Wrikken

答えて

0

PHPの参考文献とその弱点に関連していると思います。

PHPで参照すると、バインディングが作成されます。 PHPオブジェクトの型付けは厳密ではなく、phpは、オブジェクトには['hey']が存在する可能性があると解釈されるオブジェクトの種類を参照していません。

PHPにはレイトバインドと厳密な型指定がありません。だからこのような「奇妙な」ことが時々起こります。

-3

のみを使用しerror_reporting(1) のphpファイルの先頭に...

+0

これは非常に簡潔な答えです。詳細な説明が参考になります。 –

1

あなたは、割り当てるパス、または参照によって未定義の変数を返す場合はそれが行動

http://www.php.net/manual/en/language.references.whatdo.php#language.references.whatdo.assign

予想されます、それは が作成されます。

そして、いくつかの関連「バグ」:

https://bugs.php.net/bug.php?id=30350

[OK]を、我々が存在しない何かへの参照を返すように をしようとしているので、要素が作成されたことが表示されます。

https://bugs.php.net/bug.php?id=27627

あなたは非existant配列要素にアクセスしようとすると、あなたは効果的 ので、配列内のNULLのエントリは、それを作成します。

関連する問題