2
2

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

PHP の関数の引数に未定義変数を参照渡しすると、関数の引数のデフォルト値が適用されない。

PHP の未定義変数は NULL になる

PHPでの参照渡し - Qiita http://qiita.com/akisssa/items/342d742c6ce9cd30b050

PHPでは原則的に未定義の変数の値を取得しようとしたときに Notice が発生して NULL 扱いになるが、参照渡しのデフォルト値の場合だけ例外的にNoticeを発生せずにNULLとして初期化される。この場合、関数側でデフォルト値に何を指定してもNULLと見なされることに注意する必要がある。

PHP: NULL - Manual http://php.net/manual/ja/language.types.null.php

変数は、以下の場合に NULL とみなされます。

・定数 NULL が代入されている場合。

・まだ値が何も代入されていない場合。

・unset() されている場合。

PHP では未定義の変数は NULL になる。という基本原則を覚えていれば良さそう。

関数の引数が値渡しの場合

サンプルコード

<?php

function test($x=100)
{
  if (is_null($x)) {
    echo "\$x=[null]", PHP_EOL;
  } else {
    echo "\$x=[$x]", PHP_EOL;
  }
  $x = 10000;
}

echo '【引数なし】', PHP_EOL;
test();
echo PHP_EOL;

echo '【0が代入された変数$aを引数に指定】', PHP_EOL;
$a = 0;
test($a);
echo "\$a=[$a]", PHP_EOL, PHP_EOL;

echo '【未定義の変数$bを引数に指定】', PHP_EOL;
test($b);
echo "\$b=[$b]", PHP_EOL, PHP_EOL;

実行結果

引数なし
$x=[100]

0が代入された変数$aを引数に指定
$x=[0]
$a=[0]

未定義の変数$bを引数に指定
PHP Notice:  Undefined variable: b in /Users/foo/sample.php on line 23

Notice: Undefined variable: b in /Users/foo/sample.php on line 23
$x=[null]
PHP Notice:  Undefined variable: b in /Users/foo/sample.php on line 24

Notice: Undefined variable: b in /Users/foo/sample.php on line 24
$b=[]

未定義変数を参照する際に、Notice が発生している。

関数の引数が参照渡しの場合

サンプルコード

<?php

function test(&$x=100)
{
  if (is_null($x)) {
    echo "\$x=[null]", PHP_EOL;
  } else {
    echo "\$x=[$x]", PHP_EOL;
  }
  $x = 10000;
}

echo '【引数なし】', PHP_EOL;
test();
echo PHP_EOL;

echo '【0が代入された変数$aを引数に指定】', PHP_EOL;
$a = 0;
test($a);
echo "\$a=[$a]", PHP_EOL, PHP_EOL;

echo '【未定義の変数$bを引数に指定】', PHP_EOL;
test($b);
echo "\$b=[$b]", PHP_EOL, PHP_EOL;

実行結果

【引数なし】
$x=[100]

【0が代入された変数$aを引数に指定】
$x=[0]
$a=[10000]

【未定義の変数$bを引数に指定】
$x=[null]
$b=[10000]

未定義変数を参照しても、Notice が発生していない。

2
2
1

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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?