PHPの条件分岐if文で使える関数issetやemptyなどの特徴と違いは?

Programming

こんにちは。あきのりです。
21歳でニートに転落しつつも、プログラミングと英語を勉強しながらなんとか生きています。

今回のテーマは「PHPのissetやemptyってどう違うの?」です。

よくif文などでこれらが使われるんですが、これ関連の関数が4つくらいあったり、それぞれで微妙に違ったりと厄介なんですよね。

調べてると「if($var)!empty($var)が同じじゃん!」という疑問も浮かんでくるわけです。

ここには重要な違いが隠されているのでそれも同時に解説していきます。それではいきましょう。

値があるかないかを調べる関数は4つあります

まず、変数に値があるかないかを調べるための関数が主に4つあります。

  • if($var)
  • isset($var)
  • empty($var)
  • is_null($var)

最初のは厳密には関数ではないんですが、変数の値の有無を調べるという点で関数とみなして紹介してます。
(そもそも、これら関数はif文でしか用途がないので)。

それぞれ、値があるかないかを判断し、trueだったりfalseだったりを返します。
それぞれにちょっと違いがあるので、よく見る早見表を紹介します。(引用)

こちらのサイトから早見表をもってきました。
それぞれが微妙に違っていますが、

  • if($var)empty($var)が相補的
  • isset($var)is_null($var)が相補的

という関係になっています。

実際に使ってみる

ちょっとどうやって使うか見てみます。


<?php

$var = 'My Data';

if(empty($var)) {
  echo '代入してください';
}
else {
  echo $var;
}

条件分岐で値がなければ(empty($var)trueなら)「代入してください」と表示し、値があればその変数の値を表示します。

今回の場合は”My Data”という値がありますから、この文字列が表示されます。

こんな感じで条件分岐によって処理を変えたいときによく使われます。’値がありません’

if($var)とempty($var)って2つも必要?

ここまでは簡単なんですが、1つ疑問がありますよね?

if($var)とempty($var)って2つもいる?

実際、さっきの早見表を見ても、この2つは相補的なわけですから、2つもいらないように思えます。
例えばempty($var)!empty($var)で事足りるというわけです。
(ちなみに!は「反対」という意味で、truefalseが逆になる)

ただ、2つあるのには理由があって、この違いが結構重要です。

未定義変数がエラーになるかどうか

結論を言うと、未定義の変数を扱えるかどうかが違います。

変数は普通何らかの値を代入して「定義」するんですが、たまに定義されていない場合はあります(その場合についてはのちほど)。

この未定義変数が扱いにちょっと苦戦するんですね。

if($var)とempty($var)の違い

例えば、以下のプログラムを実行してみます。


<?php

error_reporting(E_ALL);

$var;

if($var) {
  echo $var;
}
else {
  echo '値がありません';
}

error_reporting(E_ALL)ですべてのエラーを表示するようにして、先ほどと同じように、$varに値があればそれを表示、なければ「値がありません」と表示します。

結果はこんな感じ。

Notice: Undefined variable: var in C:\xampp\htdocs\test\test.php on line 7
値がありません

「値がありません」と実行はできているんですが、Noticeエラーが出ています。
「7行目のvarという変数に値が入っていません」というエラーです。
7行目というのはif($var)というところで、ここでエラーが出ていることになります。

では、ちょっとコードを変えてみます。


<?php

error_reporting(E_ALL);

$var;

if(!empty($var)) {
  echo $var;
}
else {
  echo '値がありません';
}

if($var)の部分をif(!empty($var))に変えました。条件は全く同じです。
これらを実行するとこうなります。

値がありません

先ほどとは違って、エラーが出ていません。

つまり、未定義変数を使う場合

  • if($var)だとNotice(注意)が表示される
  • empty($var)だとエラーは表示されない

となるんですね。

issetis_nullの違い

issetis_nullでも同じようなことが言えます。

具体例は出しませんが、結論はこんな感じ。

  • is_nullだとNotice(注意)が表示される
  • issetだとエラーは表示されない
今回はすべてのエラーを出すようにしたのでこんな結果になりました。もちろん、”Notice”を非表示にすれば回避できますが、開発中はこういうエラーも対処しておくのがベストでしょう。

POSTGETを使ってデータ送信する際に使える

基本的に、変数が未定義という状態は起こりにくいんですが、よくある例がPOSTなどを使ったデータ送信です。

例えば、ページ内で検索をかけるときにデータを送信してそれを受け取り、それを元に処理をすると思います。


<php
$tag = $_POST['tag'];

if($tag) {
  //tagを使ってデータを取り出す
}
else {

}
?>
//以降でページを表示(html文)

このようなプログラムを実行するとき、一番最初にこのページにアクセスした場合、最初は何も送信されていないので、$tagは未定義になってしまいます。
そうすると、先ほどと同じように注意が出てしまいます。

それを避けるために、例えば、以下のようにプログラムを書けます。


<php
$tag = $_POST['tag'];

if(!empty($_POST['tag'])) {
  $tag = $_POST['tag'];
  //tagを使ってデータを取り出す
}
else {

}
?>
//以降でページを表示(html文)

先ほど見たようにemptyは未定義変数を扱ってもエラーが出ないので、これで先に条件分岐しておけば問題なく実行されます。

実際には、データ取得とページ表示はファイルを分けた方が良いのですが、今回は簡単な例として紹介しました。

まとめ

というわけで、今回は条件分岐に使える関数について解説しました。
さっそくphpを使ってwebサービスやサイトを作ってみましょう。

それでは、また。

スポンサードサーチ

オススメ英語学習用SNS "Our Dictionary"

人気記事英語学習用SNSをLaravelで作ってみた【システム解説あり】