遠き君へ

〜インターネットの最果てで自分語りを垂れ流したり垂れ流さなかったりするブログ〜

【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みたいな扱いになる、という風に理解しました。

background image is created by Niellyn & bhsav.