こんにちは、角かっこ内で一重引用符を使用しないよりも安全であると読んだことがありますが、本当ですか?
echo $row[0];
echo $row[id];
また
echo $row['0'];
echo $row['id'];
はい。
define("id", "something else");
$row = array(
"id" => 5,
"something else" => "foobar"
);
echo $row["id"]; // 5
echo $row[id]; // foobar
また、E_STRICT
モードで$row[id]
は警告が表示されます。これが、常にE_STRICT
on で開発する必要がある理由です。error_reporting(E_ALL | E_STRICT);
スクリプトの先頭に配置してオンにします。
$row[0]
と$row["0"]
同等です。これらを適切に使用できます(インデックス付き配列と連想配列?)
あなたの最初の例: [0]
または['0']
キーは数値であるため、これには引用符は必要ありません。
2番目の例: [id]
または['id']
これには間違いなく引用符が必要です。引用符のないバリアントはPHPのレガシー機能であり、実際にはこれ以上使用しないでください。
引用符を含めない場合、実際には、文字列ではなくdefine()
名前付きのを使用するようにPHPに指示していることになります。ほとんどの場合、これは機能します。PHPには、存在しない定義を指定した場合に、エラーをスローするのではなく、同等の文字列を想定する機能があるためです。(これはPHPの最悪の設計上の決定の1つですが、それはここでのポイントの脇にあります)id
id
重要なのは、ほとんどの場合、どちらの方法でもまったく同じように動作するということです。引用符のないバージョンは、定義を検索し、見つからない場合は文字列変換を行う必要があるため、実行速度は遅くなりますが、それほど遅くなることはありません。あなたはそれに気付かないでしょう。
本当の危険は、コードのどこかで同じ名前の定義を作成した場合です。例:
define('id','blahblah');
これで、 PHPはであると見$var[id]
なされ$var['blahblah']
、コードが破損します。
定義がいつ使用されるかを知るのは必ずしも簡単ではありません(特にサードパーティのライブラリを含める場合)。つまり、引用符のないコードは今は機能するかもしれませんが、突然壊れてしまう可能性があるのはいつかわかりません。あなたはその理由を理解することができます。
したがって、文字列の場合は、配列要素名に常に引用符を使用することをお勧めします。
引用符は文字列リテラルを示し、引用符なしは整数または定数のいずれかを示します。
連想配列で名前付き配列キーを探している場合、通常は文字列リテラルを使用します。IE$row['id']
ではなく$row[id]
(動作しないはずです)。
数値配列キーを探している場合、文字列は整数にキャストされます。したがって$row['0']
、 に評価する必要があり$row[0]
ます。それでも、実際の整数 ( $row[0]
) を使用することをお勧めします。変数のキャストが原因で実際にパフォーマンスが低下するかどうかはわかりませんが、読みやすさと正確さのために正しいデータ型を使用することをお勧めします。