質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

意見交換

クローズ

6回答

761閲覧

PHPの変数チェックにおいて、issetを省略する書き方は適切かどうか

pgm_bakabon

総合スコア61

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/02/14 07:45

0

0

テーマ、知りたいこと

PHPの変数チェックにおいて、issetis_nullを省略可能だと思います。
この書き方は、適切なのでしょうか?

例:以下の2つのコードは成立すると思います。

php

1$a = 'テスト'; 2if ($a) { 3 // ここに入る 4 echo $a; 5}

php

1$a = null; 2if ($a) { 3 // ここには入らない 4 echo $a; 5}

背景、状況

issetis_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

arcxor

総合スコア2859

投稿2023/02/14 07:57

変数 $a が、

  • 宣言されていて null 値でないかを判定したい場合は if (isset($a))
  • null 値でないかを判定したい場合は if (!is_null($a)) または if ($a !== null)
  • truthy な値であるかを判定したい場合は if ($a) または if ($a == true)

というだけであって、「issetis_null を省略」しているわけではありません。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

melian

総合スコア19798

投稿2023/02/14 08:06

php

1<?php 2 3$a = 0; 4if (isset($a)) { 5 // ここに入る 6 echo '"$a" is set'; 7} 8 9if ($a) { 10 // ここには入らない 11 echo '$a = ' . $a; 12}

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

yambejp

総合スコア114839

投稿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

kawax

総合スコア10377

投稿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

miwakazuo

総合スコア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 = [];

issetis_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 など、調べる値が持つ属性によって、適宜使い分けるのがよろしいかと思います。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#6

pgm_bakabon

総合スコア61

投稿2023/02/16 13:26

みなさま、ご回答ありがとうございます。
kawax様の 省略してるのはissetとかではなくif((bool) $a) のご回答をいただけたて、皆様からのご回答をより理解することができました。
if((bool) $a の自動変換を考えると、自動変換する必要がない変数・値も if ($a) として記載していました。
boolean型以外は、isset、is_null、emptyをしっかり定義する方針にしたいと思います。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問