PHPを長らく扱ってきましたが、こんな結果になるはずがないですよね?

特定バージョンのバグかと思ったら複数の環境で起きてるのでびっくりした。
むしろこの仕様でいままで自分がつまづかなかったのが不思議です。
なにこれ?

<?php

$test1 = "ABCDE";
var_dump($test1['undefined']);

echo "<br>";

$test2 = "12345";
var_dump(isset($test2['undefined']));

echo "<br>";

echo PHP_VERSION;

?>

string(1) "A"
bool(true)
4.3.11/5.2.6 ※両方で確認

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/11/06 22:26:56
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:krese No.1

回答回数20ベストアンサー獲得回数4

ポイント60pt

http://jp.php.net/manual/ja/language.types.string.php

の「文字列への文字単位のアクセスと修正」にあるように

$str[42] のように、 角括弧を使用してゼロから始まるオフセットを指定すると、 文字列内の任意の文字にアクセスし、修正することが可能です。 つまり、文字列を文字の配列として考えるわけです。 波括弧の後に任意の文字をゼロから始まるオフセットで指定することにより、 文字列内の文字にアクセス/修正することが可能です。

となります。


文字列はすべて0として評価されるので、実行された結果のようになります。

$test1['aaa']

$test1[0]

$test1[1]

あたりを試してみると、わかりやすいかと思います。

id:Knoa

動作としてはそれが正解かなぁという気はしてました。

ついカッとなって「はてな」してしまいましたが、そうするとisset()の使いどころには気をつけないとダメですね…。

今回はずばり、年月日が、year,month,dayの配列、または"2000-01-01 00:00:00"のような文字列で入る変数に対して、

if(isset($value['year'], $value['month'], $value['day']))

とやろうとしたんですが、is_array()も追加しないとダメな感じですかね。

キモいなぁ。そのひと手間を惜しむ考えのほうがキモイのかな。

2008/11/06 20:27:28
  • id:Knoa
    自分が、型の意識が軽薄なPHP脳になってるってことかなぁと思い始めた。
    「型不明なら型判断必須だろ!」が正解か。
  • id:krese
    なるほど。
    そのシーンはなかなかアリそうな感じですね。
    settype($test1, 'array');
    としてから処理しているのを見たことはあります。
    is_arrayかsettypeかどちらか使うことにはなりそうですね。
  • id:Knoa
    ありがとうございました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません