4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPの変数初期化の癖

Posted at

やっても大丈夫なんだっけ?とよく混乱するので。。以降、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]);
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?