isset($var)は、変数が存在してその値がnullでなければtrueを返します。未定義の変数、unsetされた変数、nullが入った変数にはfalseを返し、警告は決して出しません。
isset()が見るのは、何かがそこにあるかどうかだけです。0、""、[]のように設定されているが空の値でもtrueを返します。「設定されていて空でない」を確かめたいなら、emptyを否定して使います。
issetで配列のキーが存在するか確認する
isset()がいちばん使われるのはここです。存在しないキーを読むと、通常のPHPの設定ではWarning: Undefined array keyが表示されますが、先にisset()で確認すれば表示されません。ネストしたキーにも使え、最初に欠けている階層で静かに止まります。
値か既定値が欲しいだけなら、$user["website"] ?? "none"が同じ確認を1ステップで行います。null合体演算子を参照してください。
複数の変数をissetで確認する
複数の引数を渡すと、isset()はすべてが設定されていてnullでないときだけtrueを返します。必須の項目がすべて届いたかを確かめる短い方法です。
文字列とオブジェクトに対するisset
文字列では、isset($str[5])はオフセット5に文字があるかを確認するので、手早い長さのチェックになります。オブジェクトではプロパティを確認します。privateなデータを持つクラスで__isset()メソッドが定義されていれば、isset()はそれを呼び出します。
issetとemptyとis_nullの比較
表で$xの値を選ぶと、3つのチェックと素の(bool)キャストを比べられます。すべてのセルはPHP 8.3で計算したものです。
| $x | isset | empty | is_null | bool |
|---|---|---|---|---|
| null | ||||
| false | ||||
| 0 | ||||
| "0" | ||||
| "" | ||||
| " " | ||||
| [] | ||||
| "a" | ||||
| 1 | ||||
| 0.0 | ||||
| "0.0" |
覚えておきたいパターンです。
isset()がfalseになるのは、nullと存在しないものだけです。empty()はそれらに加え、falseと評価されるすべての値でもtrueになります:false、0、0.0、""、"0"、[]。is_null()は、存在する変数ではisset()の反対の結果になりますが、変数が未定義だと警告を出します。代わりにisset()か=== nullを使いましょう。
フォームが送信されたか確認する
フォームの項目が届いたかを調べるには、isset()を使うのが定番です。このブロックを実行し、名前を入力してSendを押すと、$_POSTに値が入った状態で同じスクリプトがもう一度実行されます。
空のテキスト欄も""として送信されるので、送信後は必ずisset($_POST["name"])がtrueになります。チェックを入れていないチェックボックスはまったく送信されないので、チェックボックスにはisset()がまさに適したテストです。空でない値を必須にするには、このブロックのようにtrimした文字列を確認します。バリデーション付きの完全なフォームはフォームのページで作ります。
issetとarray_key_existsの違い
2つは、値がnullのキー以外ではすべて同じ答えを返します。isset()はそれを存在しないものとして扱い、array_key_exists()は扱いません。
データの中で「nullに設定されている」が「設定されていない」と別の意味を持つなら、array_key_exists()を使います。そうでなければisset()のほうが短く、関数呼び出しではなく言語構造なので少し速くもあります。
よくあるミス:式に対してissetを使う
isset()が受け付けるのは、変数、配列の要素、プロパティだけです。関数の結果や定数を渡すとコンパイルエラーになります。
<?php
if (isset(trim($input))) {}
PHP Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /home/index.php on line 2
先に結果を変数に入れるか、値そのものを判定します。メッセージが示すとおりnull !== $exprと書くか、文字列ならtrim($input) !== ""と書きます。
よくある質問
PHPのisset()は何をしますか?
isset($x)は、$xが存在してnullでなければtrueを、そうでなければfalseを返します。未定義の変数や配列キーに対して警告を出さないので、isset($_POST['email'])のようにリクエストのデータに安全に使えます。
PHPのisset()とempty()の違いは何ですか?
isset()は「存在してnullでないか」を、empty()は「存在しないか、falseと評価されるか」を問います。0、""、"0"、[]では、isset()はtrueを返し、empty()もtrueを返します。nullや存在しないキーでは、isset()はfalse、empty()はtrueです。!empty($x)は、isset($x) && $xがtrueと評価されるのと同じです。
isset()で複数の変数を確認できますか?
できます:isset($a, $b, $c)は、すべてが設定されていてnullでないときだけtrueを返します。設定されていない最初のもので止まります。
isset()とarray_key_exists()のどちらを使うべきですか?
違いが出るのは、キーが存在して値がnullのときだけです:isset($arr['k'])はfalseを、array_key_exists('k', $arr)はtrueを返します。nullが意味のある格納値ならばarray_key_existsを使い、そうでなければ短くて少し速いissetを使います。