変数・型

PHPのissetとemptyの使い方について解説

PHPで変数の状態を確認する際によく使われるissetemptyについて、基本的な使い方を実践向けに紹介します。

シンプルな例を通して、変数がセットされているか、または値が空かどうかを手軽に判定する方法を確認してください。

PHPにおける変数チェック手法

isset関数の基本仕様

定義と動作の概要

isset関数は、変数が存在していて、なおかつその値がNULLでないかを確認するための関数です。

変数が定義されていない場合や、値がNULLの場合にはfalseを返します。

例えば、以下のコードは変数が定義されているかどうかをチェックする基本的な例です。

<?php
// 変数が定義されているかどうかを確認
$variable = "サンプル値";
if (isset($variable)) {
    echo "変数は定義されており、NULLではありません。";
} else {
    echo "変数が定義されていないか、NULLです。";
}
?>
変数は定義されており、NULLではありません。

返り値の意味と注意点

issetは、チェック対象の変数が1つ以上ある場合、すべての変数が定義され、かつNULLではない場合にtrueを返します。

注意点として、以下の点が挙げられます。

  • 複数の変数を同時に調べることが可能ですが、どれか一つでも未定義またはNULLであればfalseを返します。
  • 存在しない変数に対してアクセスすると、エラーは発生せずにfalseが返されるため、未定義の変数を扱う際に便利です。
<?php
// 複数の変数の存在を確認する例
$a = "値A";
$b = null;
if (isset($a, $b)) {
    echo "すべての変数が定義され、NULLではありません。";
} else {
    echo "どれかの変数が未定義またはNULLです。";
}
?>
どれかの変数が未定義またはNULLです。

empty関数の基本仕様

定義と動作の概要

empty関数は、変数が未定義、または「空」であるかどうかをチェックするために使用されます。

「空」とは、NULL、空文字列""、整数値の0、文字列の"0"、空の配列、falseなど、PHPで「偽」と評価される値が含まれます。

そのため、emptyは指定した変数の値が「空」であればtrueを返します。

<?php
// 変数が空かどうかを確認
$value = "";
if (empty($value)) {
    echo "変数は空です。";
} else {
    echo "変数は空ではありません。";
}
?>
変数は空です。

返り値の意味と評価方法

emptyは、変数が未定義である場合も含め、変数の値が「空」と評価されるならばtrueを返します。

例えば、変数が0であっても数学的には0であるため実態はあるものの、PHPでは「空」として扱われるためtrueが返される点に注意が必要です。

<?php
// 数値の0が空かどうかを確認
$number = 0;
if (empty($number)) {
    echo "変数は空と評価されます。";
} else {
    echo "変数は空ではありません。";
}
?>
変数は空と評価されます。

具体的な使用例と実装例

基本的な利用方法

issetの使用例

以下の例では、isset関数を用いてフォームから送信されたデータが存在するかどうかを確認する方法を示します。

<?php
// フォーム送信されたデータを受け取る例
$formData = $_POST["username"] ?? null;
// usernameが定義され、NULLでない場合に処理を実行
if (isset($formData)) {
    echo "ユーザーネームが送信されました: " . $formData;
} else {
    echo "ユーザーネームのデータが存在しません。";
}
?>
ユーザーネームが送信されました: サンプルユーザー

emptyの使用例

次の例は、チェックボックスなどで送信された値が空かどうかを判定する際にemptyを利用したサンプルコードです。

<?php
// チェックボックスで送信された値を確認する例
$agree = $_POST["agree"] ?? "";
// agreeの値が空ならば、チェックが入っていないと判断
if (empty($agree)) {
    echo "同意のチェックが行われていません。";
} else {
    echo "同意のチェックが行われています。";
}
?>
同意のチェックが行われています。

複雑なケースへの対応

多次元配列でのチェック

多次元配列の場合、特定のキーや値が設定され、かつNULLでないかをチェックする必要があります。

以下は、ユーザー情報が含まれた多次元配列の例です。

<?php
// ユーザー情報を含む多次元配列の例
$userInfo = [
    "name" => "太郎",
    "contact" => [
        "email" => "taro@example.com"
    ]
];
// emailキーが存在し、NULLではないかをチェック
if (isset($userInfo["contact"]["email"])) {
    echo "メールアドレスが設定されています: " . $userInfo["contact"]["email"];
} else {
    echo "メールアドレスが設定されていません。";
}
?>
メールアドレスが設定されています: taro@example.com

オブジェクトプロパティの確認

オブジェクトの場合、プロパティが存在しているかどうかの確認にissetを活用できます。

下記は、ユーザーの詳細情報を持つオブジェクトの例です。

<?php
// ユーザーの詳細情報を持つオブジェクトの例
$user = new stdClass();
$user->name = "花子";
$user->age = 25;
// プロパティが存在し、NULLではないかをチェック
if (isset($user->age)) {
    echo "ユーザーの年齢は設定されています: " . $user->age;
} else {
    echo "ユーザーの年齢が設定されていません。";
}
?>
ユーザーの年齢は設定されています: 25

issetとemptyの使い分けのポイント

条件分岐での違い

NULL、空文字、0の取り扱い

isset関数とempty関数では、同じ変数に対して異なる結果が返されるケースがあります。

主な違いは以下の通りです。

  • 変数がNULLの場合
    • isset: falseを返す。
    • empty: trueを返す。
  • 変数が空文字""の場合
    • isset: 定義されていればtrueを返す。
    • empty: trueを返す。
  • 変数が整数値の0の場合
    • isset: 定義されていればtrueを返す。
    • empty: PHPの定義によりtrueと評価される。

以下は、これらの違いを確認するためのサンプルコードです。

<?php
// 異なる値を持つ変数の例
$varNull = null;         // NULL
$varEmptyString = "";    // 空文字
$varZero = 0;            // 0
// 各変数のissetとemptyの結果を出力
echo "NULL判定:\n";
echo "isset: " . (isset($varNull) ? "true" : "false") . "\n";
echo "empty: " . (empty($varNull) ? "true" : "false") . "\n\n";
echo "空文字判定:\n";
echo "isset: " . (isset($varEmptyString) ? "true" : "false") . "\n";
echo "empty: " . (empty($varEmptyString) ? "true" : "false") . "\n\n";
echo "0判定:\n";
echo "isset: " . (isset($varZero) ? "true" : "false") . "\n";
echo "empty: " . (empty($varZero) ? "true" : "false") . "\n";
?>
NULL判定:
isset: false
empty: true
空文字判定:
isset: true
empty: true
0判定:
isset: true
empty: true

他の変数評価との比較

issetempty以外にも、変数の状態をチェックするための関数としてis_nullisset($var) && $var !== ""などが利用される場合もあります。

これらは用途に応じて使い分けることで、より柔軟な条件分岐が可能となります。

たとえば、変数が未定義であるかも含めたチェックを行いたい場合はemptyが便利ですが、単にNULLかどうかを知りたい場合はis_nullが役立ちます。

注意すべき挙動とパフォーマンス面

実装時に気をつけるべきポイントとして、以下の点が挙げられます。

  • 存在確認と値の評価を混同しないように注意する必要があります。

たとえば、issetは変数の存在を確認しますが、その値が「空」であるかどうかは判断しません。

  • パフォーマンス面では、単純な変数チェックであればどちらの関数も十分高速に動作しますが、複雑な条件下や多重チェックが重なる場合は、処理の流れを理解し、適切な関数を選択することが重要です。

実装に役立つコーディングの工夫

コードの可読性向上

コメントの付け方

コードの可読性向上には、コメントを適切に記述することが大切です。

特に、変数チェックの意図やコードの動作について簡潔に記述することで、後からコードを読んだ際に理解しやすくなります。

以下の例では、issetを使った変数チェックに対してコメントを追加しています。

<?php
// $userDataが定義され、NULLではないかをチェック
if (isset($userData)) {
    // 変数が正しく定義されている場合の処理
    echo "ユーザーデータが存在します。";
} else {
    // 未定義またはNULLの場合の処理
    echo "ユーザーデータが存在しません。";
}
?>

変数命名の工夫

変数名は、その変数が何を保持しているかを明確に示すために工夫することが重要です。

たとえば、ユーザー情報を扱う場合は$userData、フォームの入力値を扱う場合は$inputValueなど、意味のある名前にすることでコード全体の分かりやすさが向上します。

<?php
// ユーザーの年齢を保持する変数
$userAge = 30;
// 年齢情報が存在するかをチェック
if (isset($userAge)) {
    echo "ユーザーの年齢は " . $userAge . " 歳です。";
}
?>
ユーザーの年齢は 30 歳です。

デバッグとテストの実践

var_dumpを利用した検証

変数の中身や型を検証する際にはvar_dumpが便利です。

簡単なサンプルコードを以下に示します。

<?php
// サンプル変数を定義
$sampleData = "テストデータ";
// 変数の型と値を出力して確認
var_dump($sampleData);
?>
string(14) "テストデータ"

テストケースの作成と確認

実際の開発では、様々なパターンに対してテストケースを作成することで、意図しない動作を防ぐことができます。

たとえば、フォームから送信されたデータに対して、issetemptyが正しく動作するかをテストする場合、以下のようなケースを考えると良いでしょう。

  • 変数が未定義の場合の動作チェック
  • 変数がNULLの場合の動作チェック
  • 変数が空文字の場合の動作チェック
  • 変数が数値の0の場合の動作チェック

各ケースに対して、期待する結果と実際の結果を確認し、必要に応じてコードを修正することで、バグの発生を抑えることが可能です。

<?php
// テスト用の変数を定義
$testValues = [
    "undefined" => null,         // 未定義に近い状態としてnullを設定
    "null" => null,
    "emptyString" => "",
    "zero" => 0,
    "nonEmpty" => "データ"
];
foreach ($testValues as $key => $value) {
    echo "テストキー: " . $key . "\n";
    echo "isset: " . (isset($value) ? "true" : "false") . "\n";
    echo "empty: " . (empty($value) ? "true" : "false") . "\n";
    echo "\n";
}
?>
テストキー: undefined
isset: false
empty: true
テストキー: null
isset: false
empty: true
テストキー: emptyString
isset: true
empty: true
テストキー: zero
isset: true
empty: true
テストキー: nonEmpty
isset: true
empty: false

まとめ

この記事では、PHPの変数チェック手法として、issetemptyの基本的な仕様や使い方を詳しく説明しました。

両者の動作や違い、実装例を通じて、適切な変数評価方法について理解が深まりました。

ぜひ、実際の開発でこれらの手法を試して、コードの安定性向上に役立ててください。

関連記事

Back to top button
目次へ