PHPのissetとはなんなのか

採用はこちら

目次

PHPのissetとは

PHPのisset()は、変数が宣言されていて、かつ値がnullではないかを確認するための言語構造です。

フォームから送信された値の確認や、配列キーの存在チェック、未定義変数へのアクセス回避など、PHPでは非常によく使われます。

見た目は関数のようですが、厳密には通常の関数ではなく、PHPの言語構造です。

issetの基本的な書き方

基本的な書き方は次のとおりです。

isset($variable);

条件を満たす場合はtrue、満たさない場合はfalseを返します。

たとえば、変数に文字列が代入されている場合はtrueになります。

$name = 'Taro';

var_dump(isset($name));

実行結果は次のとおりです。

bool(true)

一方、変数の値がnullの場合はfalseになります。

$name = null;

var_dump(isset($name));

実行結果は次のとおりです。

bool(false)

つまり、isset()は単純に「変数が宣言されているか」だけではなく、「宣言されていて、値がnullではないか」を確認するものです。

issetの基本的な使い方

変数が設定されているか確認する

isset()の代表的な使い方は、変数が利用できる状態かどうかを確認することです。

$message = 'Hello';

if (isset($message)) {
    echo $message;
}

この場合、$messageは宣言されていて、値もnullではないため、Helloが表示されます。

未定義の変数に対しても、安全に確認できます。

if (isset($message)) {
    echo $message;
}

$messageが宣言されていない場合は、isset($message)falseになります。

未定義変数を直接参照すると警告が発生する可能性がありますが、isset()を使えば存在確認を安全に行えます。

issetで配列のキーを確認する方法

isset()は、配列に特定のキーが存在し、その値がnullではないかを確認するときにもよく使われます。

$user = [
    'name' => 'Taro',
    'age' => 30,
];

if (isset($user['name'])) {
    echo $user['name'];
}

この場合、nameキーが存在し、値もnullではないため、Taroが表示されます。

存在しない配列キーを確認する場合

次のように、存在しないキーを指定した場合はfalseになります。

$user = [
    'name' => 'Taro',
];

var_dump(isset($user['email']));

実行結果は次のとおりです。

bool(false)

存在しない配列キーを直接参照するのではなく、あらかじめisset()で確認することで、安全に処理できます。

ネストした配列にも使用できる

isset()は、階層が深い配列の確認にも利用できます。

if (isset($data['user']['profile']['name'])) {
    echo $data['user']['profile']['name'];
}

途中のキーが存在しない場合でも、存在確認として使用できます。

issetはnullの場合にfalseになる

isset()を理解するうえで特に重要なのが、値がnullの場合はfalseになるという点です。

たとえば、次の配列を考えてみましょう。

$user = [
    'name' => null,
];

nameというキー自体は存在しています。

しかし、次の結果はfalseになります。

var_dump(isset($user['name']));
bool(false)

これは、isset()が「キーが存在するか」だけではなく、「キーが存在し、その値がnullではないか」まで確認しているためです。

issetとarray_key_existsの違い

配列のキーを確認するときに、isset()とよく比較されるのがarray_key_exists()です。

nullの扱いが異なる

両者の最大の違いは、値がnullの場合です。

$user = [
    'name' => null,
];

var_dump(isset($user['name']));
var_dump(array_key_exists('name', $user));

実行結果は次のようになります。

bool(false)
bool(true)

isset()は、値がnullであるためfalseになります。

一方、array_key_exists()は値に関係なく、キーそのものが存在していればtrueを返します。

そのため、使い分けの目安は次のとおりです。

  • キーが存在し、値がnullではないか確認したい場合はisset()
  • nullかどうかに関係なくキーの存在自体を確認したい場合はarray_key_exists()

issetとemptyの違い

isset()と混同されやすい言語構造としてempty()があります。

issetはnullかどうかを確認する

isset()は、変数が宣言されていて、値がnullではない場合にtrueになります。

emptyは空とみなされる値か確認する

一方、empty()は、値がPHPで「空」とみなされる場合にtrueを返します。

たとえば、次のコードを確認してみましょう。

$value = 0;

var_dump(isset($value));
var_dump(empty($value));

実行結果は次のとおりです。

bool(true)
bool(true)

$valueには0が代入されているため、変数は存在し、値もnullではありません。

そのため、isset()ではtrueになります。

一方、0empty()で空とみなされる値なので、empty()trueになります。

emptyで空とみなされる主な値

代表的には、次のような値がempty()trueになります。

0
0.0
'0'
''
null
false
[]

そのため、「変数が宣言されていて、nullではないか」を確認する場合はisset()、「値が空とみなされるか」を確認する場合はempty()という違いを理解しておくことが重要です。

issetでは空文字や0もtrueになる

isset()は、値が空かどうかを判定するものではありません。

たとえば、空文字の場合でもtrueになります。

$value = '';

var_dump(isset($value));

実行結果は次のとおりです。

bool(true)

同様に、次のような値でもisset()trueになります。

$value = 0;
$value = false;
$value = [];

いずれもnullではないためです。

空文字まで確認したい場合

文字列が設定されていて、さらに空文字ではないことまで確認したい場合は、別の条件を組み合わせます。

if (isset($name) && $name !== '') {
    // 値が設定されていて、空文字ではない
}

isset()だけでは「ユーザーが実際に文字を入力したか」までは判断できない点に注意しましょう。

issetで複数の変数を確認する方法

isset()には、複数の変数を指定できます。

$name = 'Taro';
$age = 30;

if (isset($name, $age)) {
    echo '両方の値が設定されています';
}

指定した変数がすべて宣言されていて、すべてnullではない場合にtrueになります。

たとえば、片方がnullの場合はfalseです。

$name = 'Taro';
$age = null;

var_dump(isset($name, $age));

実行結果は次のとおりです。

bool(false)

複数の入力値や設定値がそろっているか確認したい場合に便利です。

issetをフォーム処理で使用する方法

PHPでは、HTMLフォームから送信されたデータの確認にもisset()がよく使われます。

たとえば、POST送信されたnameを確認する場合は次のように書けます。

if (isset($_POST['name'])) {
    echo $_POST['name'];
}

これにより、$_POST['name']が存在しない状態で直接アクセスすることを避けられます。

issetだけでは入力内容の有無までは確認できない

注意したいのは、次のような空文字でもisset()trueになることです。

$_POST['name'] = '';

そのため、必須項目として入力されているかまで確認したい場合は、別の条件を組み合わせる必要があります。

if (isset($_POST['name']) && $_POST['name'] !== '') {
    echo '名前が入力されています';
}

実際のフォーム処理では、必要に応じて入力値の検証も行いましょう。

HTMLに表示するときはエスケープ処理も行う

フォームから受け取った値をHTMLとして画面に出力する場合、isset()による存在確認だけでは十分ではありません。

出力する場所に応じて、適切なエスケープ処理を行う必要があります。

HTML本文などに出力する場合は、htmlspecialchars()を使用できます。

if (isset($_POST['name'])) {
    echo htmlspecialchars(
        $_POST['name'],
        ENT_QUOTES,
        'UTF-8'
    );
}

isset()はあくまで値の存在確認を行うものであり、セキュリティ対策そのものではない点を理解しておきましょう。

issetとnull合体演算子の関係

PHP 7以降では、isset()と三項演算子を組み合わせた処理を、null合体演算子??で簡潔に書けます。

issetと三項演算子を使う場合

従来は次のようなコードを書くことができました。

$name = isset($_GET['name'])
    ? $_GET['name']
    : 'Guest';

null合体演算子を使う場合

??を使えば、次のように短く書けます。

$name = $_GET['name'] ?? 'Guest';

$_GET['name']が存在し、nullではなければその値が使われます。

存在しない、またはnullの場合は、右側の'Guest'が使用されます。

フォーム値や設定値にデフォルト値を設定する場面で便利です。

issetではnullと未定義を区別できない

isset()には、nullが代入されている状態と、変数自体が未定義の状態を区別できないという特徴があります。

たとえば、

$value = null;

の場合も、

// $value自体が未定義

の場合も、

var_dump(isset($value));

ではfalseになります。

配列キーの有無を区別したい場合

配列について、「キーは存在するが値がnullなのか」「キー自体が存在しないのか」を区別したい場合は、array_key_exists()を利用します。

$data = [
    'name' => null,
];

var_dump(isset($data['name']));
var_dump(array_key_exists('name', $data));

実行結果は次のとおりです。

bool(false)
bool(true)

この違いは、APIレスポンスや設定データなどを扱う際にも重要です。

issetを使う際の注意点

issetは通常の関数ではない

isset()は見た目こそ関数に似ていますが、厳密にはPHPの言語構造です。

PHPの通常のユーザー定義関数などとは扱いが異なるため、「PHPの組み込み関数」とだけ説明するよりも、「言語構造」と理解しておくほうが正確です。

定数の存在確認にはdefinedを使う

isset()は変数の確認に使用します。

定数が定義されているか確認したい場合は、defined()を使用します。

if (defined('APP_NAME')) {
    echo APP_NAME;
}

変数と定数では、存在確認に使用する方法が異なる点に注意しましょう。

オブジェクトでは__issetが呼び出される場合がある

クラスでアクセスできないプロパティに対してisset()を使用すると、__isset()というマジックメソッドが定義されている場合に呼び出されることがあります。

isset($object->property);

初心者が通常の変数や配列を扱う場合には意識する必要はほとんどありませんが、オブジェクト指向のPHPを扱うようになると知っておくと役立ちます。

PHPのissetを理解して安全に変数を扱おう

PHPのisset()は、変数が宣言されていて、なおかつ値がnullではないかを確認するための言語構造です。

変数だけでなく、配列のキーやフォームから送信された値などを安全に確認するために幅広く使用されます。

特に重要なのは、isset()では値がnullの場合にfalseになる一方、空文字''、数値の0falseなどはnullではないためtrueになる点です。

また、array_key_exists()empty()とは判定基準が異なります。

配列キーが存在し、値がnullではないことを確認したい場合はisset()、値がnullでもキー自体の存在を確認したい場合はarray_key_exists()、値がPHPで空とみなされるかを確認したい場合はempty()と使い分けるとよいでしょう。

isset()の特徴と他の判定方法との違いを理解しておけば、未定義変数や存在しない配列キーによる問題を防ぎながら、より安全で分かりやすいPHPコードを書けるようになります。

以上、PHPのissetとはなんなのかについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次