【PHP】参照渡しだと未定義変数でもエラーにならない
// 値渡し function issetWrapByValue($value) { return isset($value); } var_dump(issetWrap($hoge)); // -> PHP Notice: Undefined variable: hoge in ... $hoge = ['fuga' => 1]; var_dump(issetWrap($hoge['foo'])); // -> PHP Notice: Undefined variable: hoge in ... $hoge = (object)$hoge; var_dump(issetWrap($hoge->foo)); // -> PHP Notice: Undefined variable: hoge in ...
// 参照渡し function issetWrapByReference(&$value) { return isset($value); } var_dump(issetWrap($hoge)); // -> bool(false) $hoge = ['fuga' => 1]; var_dump(issetWrap($hoge['foo'])); // -> bool(false) $hoge = (object)$hoge; var_dump(issetWrap($hoge->foo)); // -> bool(false)
という感じです。
stdObject
のプロパティを渡して、それが定義されているかどうかで処理をあれこれ〜というメソッドを書こうとした時に最初値渡しにしててエラーになってちょっと焦りました 💦
理屈としては、
値渡しは「その変数の参照を解決して、参照先の値を渡す」ので、参照自体がないと途中でエラーになり、
一方参照渡しは「その変数の参照そのものを渡す」ので、参照がない(参照そのものがnull、¥0)でも値渡しの時のnullみたいな扱いになる、という風に理解しました。