特定バージョンのバグかと思ったら複数の環境で起きてるのでびっくりした。
むしろこの仕様でいままで自分がつまづかなかったのが不思議です。
なにこれ?
<?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 ※両方で確認
http://jp.php.net/manual/ja/language.types.string.php
の「文字列への文字単位のアクセスと修正」にあるように
$str[42] のように、 角括弧を使用してゼロから始まるオフセットを指定すると、 文字列内の任意の文字にアクセスし、修正することが可能です。 つまり、文字列を文字の配列として考えるわけです。 波括弧の後に任意の文字をゼロから始まるオフセットで指定することにより、 文字列内の文字にアクセス/修正することが可能です。
となります。
文字列はすべて0として評価されるので、実行された結果のようになります。
$test1['aaa']
$test1[0]
$test1[1]
あたりを試してみると、わかりやすいかと思います。
動作としてはそれが正解かなぁという気はしてました。
ついカッとなって「はてな」してしまいましたが、そうするとisset()の使いどころには気をつけないとダメですね…。
今回はずばり、年月日が、year,month,dayの配列、または"2000-01-01 00:00:00"のような文字列で入る変数に対して、
if(isset($value['year'], $value['month'], $value['day']))
とやろうとしたんですが、is_array()も追加しないとダメな感じですかね。
キモいなぁ。そのひと手間を惜しむ考えのほうがキモイのかな。