やっても大丈夫なんだっけ?とよく混乱するので。。以降、5.3.10、error_reporting(-1)の状態(一番厳しくエラーチェックする)で実行した場合です。バージョン違いで挙動が違うとかあればコメントいただければ幸いです。
いきなり添え字に代入
してもエラーは発生しない。error_reportingを一番厳しくしてても平気である。勝手に連想配列が生成される。
<?php
$a['foo'] = 'hogehoge';
var_export($a);
//array(
// 'foo' => 'hogehoge'
//)
これはnull、false、空文字で初期化していたり、単に宣言しただけでも同じ。
これもエラーにならない
<?php
$a;
$a['foo'] = 'hogehoge';
$b=null;
$b['foo'] = 'hogehoge';
0や何らかの文字列で初期化するとエラーが発生するようになるので注意!
いきなり多重に添え字に代入
さっきの応用。多次元配列風にいきなり代入してもエラーは起きない。必要なだけの配列が生成される。そういえばJavaScriptはこれができないのだった。
<?php
$a[1][2][3] = 'hogehoge';
var_export($a);
/*
array(
1 => array(
2 => array(
3 => 'hogehoge'
)
)
)
*/
しかしオブジェクトはStrictError
配列と違い、アロー演算子はちゃんとオブジェクトとして初期化されたものでないとエラーになる。ただしレベルはStrictなので一番低い。
Strictエラーが発生するけれど$aはstdClassとして生成される。
<?php
$a->hoge = 'fuga';
isset()やempty()はどんな変数を突っ込んでもエラーにならない
文法上正しいものであれば、宣言されてないどころか何がくっついていてもOK。これもJavaScriptでできないよね。
エラーにならない
<?php
isset($a->b->c->d[123][321]);
empty($a->b->c->d[123][321]);