0
0
テーマ、知りたいこと
PHPの変数チェックにおいて、isset
や is_null
を省略可能だと思います。
この書き方は、適切なのでしょうか?
例:以下の2つのコードは成立すると思います。
php
1$a = 'テスト'; 2if ($a) { 3 // ここに入る 4 echo $a; 5}
php
1$a = null; 2if ($a) { 3 // ここには入らない 4 echo $a; 5}
背景、状況
isset
や is_null
を使う方が正しいのかもしれませんが、明確に説明ができなくて困っています。
php
1$a = 'テスト'; 2if (isset($a)) { 3 // ここに入る 4 echo $a; 5}
php
1$a = null; 2if (!is_null($a)) { 3 // ここには入らない 4 echo $a; 5}
補足
普段使っているのは、PHP7.xです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
#1
総合スコア2857
投稿2023/02/14 07:57
変数 $a
が、
- 宣言されていて null 値でないかを判定したい場合は
if (isset($a))
- null 値でないかを判定したい場合は
if (!is_null($a))
またはif ($a !== null)
- truthy な値であるかを判定したい場合は
if ($a)
またはif ($a == true)
というだけであって、「isset
や is_null
を省略」しているわけではありません。
#3
総合スコア117678
投稿2023/02/14 08:33
未定義の変数を参照するかどうかの問題なので本質的にはやってはいけないことを事前に避ける処理です
@や??で回避することは可能ですが、エラーが分かりづらくなるだけなのであまりおすすめはできません
またemptyで評価できますが、empty値が設定されているものと切り分けができないので安易に利用できません
PHP
1<?PHP 2var_dump($a??null);// null 3var_dump(@$a);// null 4var_dump(empty($a)); // true 5var_dump(isset($a)); // false 6 7$b=123; 8var_dump($b??null);// 123 9var_dump(@$b);// 123 10var_dump(empty($b)); // false 11var_dump(isset($b)); // true 12 13$c=0; 14var_dump($c??null); // 0 15var_dump(@$c); // 0 16var_dump(empty($c)); // true 17var_dump(isset($c)); // true 18
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4

退会済みユーザー
総合スコア0
投稿2023/02/14 08:49
if($a)
は自動で型が変換されているだけ。
省略してるのはissetとかではなくif((bool) $a)
この自動変換で問題ない場合に使える。
https://www.php.net/manual/ja/language.types.boolean.php
自動変換、isset、is_null、empty、全部別なので動作を理解した上で使い分けが必要。
empty使っておけば困らない(素のPHPなら)
最近のこの辺使えばnullかどうか確認することもないし。
php
1echo $a ?? 'a'; 2 3echo $b?->c;
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア52
投稿2023/02/15 01:44
適切かどうかでいうと、適切とは言えないですね。
なぜなら、このifの意図が曖昧だからです。
というのは、 if($a)
という記述は以下の複数の状態を表すからです。
- $a が空白文字列ではない
- $a がfalseではない
- $a がnullではない
- $a が0ではない
- $a が空の配列ではない など
つまり、 if($a)
では次の状態は全てfalseと判定されます。
- $a = '';
- $a = 0;
- $a = null;
- $a = false;
- $a = [];
isset
や is_null
などを使うことで、これらのうちどの状態を取得したいかを明確にできます。
(ちなみに $a
が宣言されていない状態で if($a)
を実行すると、環境のini設定によっては「Warning: Undefined variable $a」と、エラーが出力されてしまいますので、宣言されているか定かではない変数にこの記述を使うのはやめましょう。)
例えば検索プログラムなどでクエリが設定されているかを調べたいときは、
php
1isset($_GET['keyword'])
$aが0でも空白でもなく「null」であることを調べるときは、
php
1is_null($a)
といったように、プログラムの文脈によって書き分けることで、処理の意図が明確になり、可読性も高くなります。
例えば年齢を問う以下のフォームがあったとします。
html
1<form action="." method="POST"> 2 <input type="text" name="age"> 3 <button type="submit">送信</button> 4</form>
入力された年齢をチェックするプログラムが以下のように書かれていたらどうでしょう。
php
1$age = $_POST['age']; 2 3if($age){ 4 echo sprintf('あなたは%d才ですね', $age); 5} 6else{ 7 echo '年齢を入力してください'; 8}
年齢に「0」を記入して送信すると、このif文はfalseとなり、「年齢を入力してください」というメッセージが表示されてしまいます。
なので、ここは
php
1if(isset($age))
や、
php
1if(is_numeric($age))
といった記述を使う方がより適切ということになります。
isset
is_null
empty
など、調べる値が持つ属性によって、適宜使い分けるのがよろしいかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。