4

PHP ドキュメントを最初に読んだとき (10 年以上前) に、配列内の文字にアクセスするための配列のような構文 ( $string[0]) が、あいまいさや未定義の動作を引き起こしたことをぼんやりと思い出しました。

O'Reilly PHP Pocket Reference (第 2 版) には次のように記載されています。

文字列と配列の間のあいまいさの問題を解決するために、文字列から個々の文字を逆参照する新しい構文が導入されました。

$string{2}

この構文は , と同等$string[2]であり、推奨されます。

$string[2]紛らわしいかもしれませんが、どうすれば曖昧になるのかわかりません。

さらに、中括弧(明らかに)が「実際の」配列でも機能することを考えると、新しい構文があいまいさ/混乱をどのように取り除くのか疑問に思います。 $string{2}

4

3 に答える 3

6

唯一のあいまいさは、配列を期待しているが実際には文字列がある$var[0]場合、最初の配列要素ではなく文字列の最初のバイトが返されることです。これにより、PHP が配列要素全体ではなく最初の文字のみを提供する理由について頭をかきむしり、不思議に思うかもしれません。$var['foo']これは、 が文字列の場合に実際に機能するのような数値以外のインデックスにはさらに当てはまり$varます (ええ、聞かないでください)。つまり、そもそもプログラムが間違っていると、デバッグが少し難しくなる可能性があります。

変数は同時に文字列と配列になることはできないため、正しいプログラムにあいまいさはありません。

于 2012-05-06T01:39:57.843 に答える
2

文字列オフセットと配列オフセットの間のあいまいさによって引き起こされた多くの問題は、5.4 の変更により削除されました。これは、リファレンスの公開日より後のものです。 http://php.net/manual/en/migration54.incompatible.php

このため、新しいコードの文字列オフセットには [] をお勧めします。

于 2012-05-06T01:49:13.590 に答える
1

さて、私はこのコードでいくつかの変数をテストしました:

<pre><?php 

dumpling(array("php"));
dumpling(array());
dumpling(0);
dumpling(1);
dumpling(TRUE);
dumpling(FALSE);
dumpling(NULL);
dumpling("php");

function dumpling($var){
    var_dump($var[0]);
    var_dump($var{0});
}

?>

そして、これら2つの間に違いはないようでした。

出力は次のとおりです。

string(3) "php"
string(3) "php"
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
string(1) "p"
string(1) "p"
于 2012-05-06T01:47:45.073 に答える