2016-11-11 29 views
1

PHP配列は()[] =失敗:リテラル配列で[]が失敗するのはなぜですか?

<?php 
// PHP Version => 5.6.13 
$e=array()[]=1;  // REJECTED "E_COMPILE_ERROR : type 64 -- Cannot use [] for reading " 
$d=array();$e=$d[]=1; // Workaround - accepted 

array() returns an arrayこととsomearray[]= assigns a value to an arrayというマニュアルにもかかわらず。

なぜですか?

+3

*は「**既存**配列が明示的に値を設定することで変更することができます。」持っている*あなたの最初の例では、あなたの配列はまだ存在しません。 – Rizier123

+0

です。 array()はそれを作成し、存在し、[]はその配列にアクセスしようとします。 – ChrisJJ

答えて

1

array()は、language constructであり、機能ではない。関数のような配列は実際にはreturnではありませんが、配列を内部的に作成します。これは一時的な式です。最初に変数に代入して配列とやりとりする必要があります。

PHP7はbetter error for this

Fatal error: Cannot use temporary expression in write context

+0

"実際には関数のように配列を返しません"。しかし、配列を返すように定義されています(引用したドキュメントを参照してください)。これは、関数のようなものであるかどうかにかかわらず、十分でなければなりません。したがって、私はバグがあると結論づけます。これは、行動と文書化が失敗することです。 – ChrisJJ

+0

@ChrisJJバグではありません... PHPエンジンの中心的な貢献者としてここに言っています。可変的な値が期待される場所では、任意の式を使用することはできません。変数のような値は、他の変数のような値の関数呼び出し、プロパティ、および配列逆参照です。 – bwoebi

+0

"バグではありません。可変的な値が期待される場所では、任意の式を使用することはできません。それは公開された言語仕様に合致しません。言語仕様は、ここでは可変的な値が必要であるとは言いません。 – ChrisJJ

関連する問題