0

配列に追加された値を配列に追加するとします。

$a = array();
$b = array();
$b[] = 42;
$a[] = $b;

echo $a[0][0];    

>> 42

出力は(予想どおり)「42」です。ここで、コードの順序を少し変更するとします。配列は参照によって渡される必要があるため、この変更はまったく違いはありません。

$a = array();
$b = array();
$a[] = $b;
$b[] = 42;

echo $a[0][0];

>> Notice: Undefined offset: 0 in /opt/iceberg/web/upload/auth.php on line 111

何を与える?私のコードをこの単純化された例に要約している間、明らかなはずの間違いを犯したという感覚を揺るがすことはできませんでした. どんな助けでも大歓迎です!

解決

参照代入を強制できます。

$a = array();
$b = array();
$a[] =& $b;
$b[] = 42;

echo $a[0][0];

>> 42

補遺:より複雑なケースで使用する=&と、不思議な方法で動作し、(私にとって) 非常に奇妙な動作を引き起こします。PHP の初心者には、by 値の割り当てに固執するのが最善だと思います。

4

1 に答える 1

2

値によって、PHP のすべては、オブジェクトを除いて byval です (そしておそらくリソース? それは久しぶりです)。$a[0]長さゼロの配列を保持します。

少し時間を遡ると (PHP 4 まで)、すべてが値渡しでした。技術的$a = new thing();には、モノの新しいインスタンスを作成し$a、それを に複製してから、元のインスタンスを破棄します。これは明らかにクレイジーな話でした。これは、オブジェクトを扱うときのパフォーマンスにとっては恐ろしいものでしたが、かなり一貫性がありました。PHP 5 で導入された、「配列といくつかのハッキングされた妖精の粉」オブジェクト モデルには、明らかに何らかのアップグレードが必要でした。PHP のユーザー ベースの大部分 (オフィスでプリンターのリセット方法を知っていて、現在は Web サイトの保守を担当している人物) の場合、物事の値による性質により物事が単純になり、断固として失敗するのが難しくなります。

詳細: 技術的には、値渡しではなく、すべてコピー オン ライトです。

于 2013-09-05T19:57:24.000 に答える