技術メモなど

業務や日々のプログラミングのなかで気になったことをメモしています。PHP 成分多め。

isset() とはなんぞや?

Twitterで isset() の挙動が話題になっていたので isset() について今一度きちんと理解しておこうと思い調べた。 バージョンは 7.2 で確認。

Q. isset() とは

A. 変数がセットされていること、そして NULL でないことを検査する言語構造
ようはちゃんと意味のある変数が定義されているかを調べるための構文。

$x;
isset($x); // false

$x = 1;
isset($x); // true

$arr = [];
isset($arr['o']['mo']['te']['na']['shi']); // false

// typo してもエラーを吐かないので注意
$hoge = 1;
isset($hogee); // false
echo $hogee; // PHP Notice:  Undefined variable: hogee in ...

変数が定義されてようが NULL でも false

文字通り、変数が定義されていてもNULLであれば false が返る。 未定義もしくはNULL値以外の変数であればすべて true が返る。

$x = null;
isset($x); // false

$x = false;
isset($x); // true

// 変数が定義済か否かのみ調べたいときは compact を使う手もある
$x = null;
!!compact($x); // true

複数同時に調べられる

isset は同時に複数のパラメータを渡せる。ひとつでも false の値があれば結果は false となる。

isset($a, $b, $c); // false

$a = 1;
$b = 2;
$c = 3;
isset($a, $b, $c); // true

unset($c);
isset($a, $b, $c); // false

変数以外は受けつけない。

isset() は変数以外の値を受け付けてくれない。リテラルや定数や関数の戻り値を渡すと深刻めなエラーを吐く。

// リテラルは×
isset(true); // PHP Fatal error:  Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in ...

// 定数も×
const HOGE = "hoge";
isset(HOGE); // PHP Fatal error:  Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in ... 

// 定数は defined を使う
defined('HOGE'); // true

// 戻り値だって×
$a = [1,2,3,4, null];
isset(array_pop($a)); // PHP Fatal error:  Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in ...

// 戻り値は代入する。
$a_last = array_pop($a);
isset($a_last); // false

isset() ≠ 関数

isset() は言語構造( if とか for とかと同じ扱い)、つまり関数ではない

is_callable('isset'); // false

なお、PHPマニュアルにも isset()は 言語構造であるという記載はあるものの、説明ページは変数操作 関数の一覧に配置されており、ファイル名も function.isset.php になっている。ちゃっかりしている。 www.php.net

なのでコールバック関数としては使用できない。 可変関数や、array_map でまとめて検査、みたいな使い方はNG。

// 可変関数には使えない
$a = 1;
$method = 'isset';
$method($a); // PHP Fatal error:  Uncaught Error: Call to undefined function isset() in ...


// コールバック関数にも使えない
$arr[0] = 1;
$arr[1] = null;
$arr[2] = 3;
array_map('isset', $arr); // PHP Warning:  array_map() expects parameter 1 to be a valid callback, function 'isset' not found or invalid function name in ..

まとめ

  • isset() はちゃんと意味のある変数が定義されているかを調べるための構文(NULLはダメ)
  • typo してもすり抜けるので気をつける
  • 複数同時に検査できるけど可読性には気をつける
  • 変数以外に使うとめちゃ怒られるので気をつける
  • 関数じゃないので可変変数やコールバック関数には使えない・使わない

用法用法を守って正しく isset() しよう!