isset()と!empty()の両方をチェックする理由


269

とに違いはissetあり!emptyますか?この二重ブールチェックを行うと、この方法で修正されますか、それとも冗長ですか?同じことをする短い方法はありますか?

isset($vars[1]) AND !empty($vars[1])

3
さまざまなタイプの変数(それらには違いがあります)でそれらを使用した結果に関する素晴らしいチャートがあります:virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton

issetとis_nullは明らかな正確な補集合ですが、!emptyはいくつかの異なるものをカバーしています。すべては、テストするデータのタイプによって異なります。
Jeff Clayton

回答:


420

これは完全に冗長です。emptyは多かれ少なかれの省略形であり!isset($foo) || !$foo、に!empty類似していisset($foo) && $fooます。つまりはempty逆の事ませissetプラスのための追加のチェックtruthiness値のを。

または言い換えれば、emptyと同じ!$fooですが、変数が存在しない場合でも警告をスローしません。これがこの関数の主要なポイントです。変数の設定を気にせずにブール比較を実行します。

マニュアルはそれをこのように置きます:

empty()反対で(boolean) var変数が設定されていない場合に警告が生成されないことを除いて。

!empty($vars[1])ここで簡単に使用できます。


7
しかし、それがない場合、$vars[1]彼は通知を受け取ります。
karim79 2010

6
どこからそのアイデアを得たのかわかりません。プラスワン。
karim79 2010

8
@karim IMO emptyは、PHPで最も誤解されている関数の1つです。「警告が生成されない」という小さなスニペットは見落とされがちです。自分で数回ドキュメントをスキャンして見つけ、ここに投稿する必要がありました。
だます

2
empty($vars[1])$vars[1]設定されていなくても警告は発生しませんが、発生しますecho $vars[1]。で事実を確認したecho $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;
Amil Waduwawara

4
@Shahor 多くの言語はと見なし0ますfalse。PHPだけではありません。それでもあなたの不満が何であるかわかりません。
だます

33

isset() 変数が設定されていてnullでないかどうかをテストします。

http://us.php.net/manual/en/function.isset.php

empty() 変数が特定の値に設定されている場合、trueを返すことができます。

http://us.php.net/manual/en/function.empty.php

これを実証するには、$ the_varを割り当てずに、0に設定し、1に設定して、次のコードを試してください。

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>

12

受け入れられた答えは正しくありません。

isset()は!empty()と同等ではありません

このルートをたどると、かなり不快でデバッグが難しいバグが作成されます。たとえば、このコードを実行してみてください:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb


7
受け入れられた回答は、それissetがと同等であることを決して示唆していません!empty
だます

8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}

1
ただし、大文字と小文字を区別せずに変数を処理していません。
Amil Waduwawara 2010

3

空のちょうどチェックは、参照された変数/配列が値を持っていることをphp doc(empty)をチェックすると、これは空であると見なされる

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

issetの間に変数が設定されていて、php doc(isset)にもあるnullでないかどうかを確認します


2

それは必要ない。

変数が存在しない場合、警告は生成されません。つまり、empty()は基本的に!isset($ var) || と同等の簡潔なものです。$ var == false。

php.net


2
空は既にisnotをチェックする(しない)ので、これはどのPHPバージョンでも必要ではありませんでした。空が質問付きの式をサポートするようになりました。
alxgb

それは、5年後のことです。
レノン

2

isset($vars[1]) AND !empty($vars[1])と同等!empty($vars[1])です。

経験的に示すために簡単なコードを用意しました。

最後の行は未定義の変数です。

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

そしてコード

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

関数自体がスコープ自体に一時変数を作成するため、未定義変数は関数の外で評価する必要があります。


0

「空」:変数に対してのみ機能します。空は、変数の種類によって意味が異なります(マニュアルを確認してください:http : //php.net/manual/en/function.empty.php)。

"isset":変数が存在するかどうかをチェックし、真のNULLまたは偽の値をチェックします。「unset」を呼び出すことにより、設定を解除できます。もう一度、マニュアルを確認してください。

どちらを使用するかは、使用している変数のタイプによって異なります。

最初に変数が存在するかどうか、そして変数が本当にNULLまたは空ではないかどうかを最初にチェックしているので、両方をチェックする方が安全です。


3
@szahn "両方をチェックする方が安全です"-プログラマはあなたが安全のために必要なすべてのものをチェックできます。しかし、コードが冗長である場合、プログラマーとして冗長になる可能性があります。
madlopt 2016

0

同じページを使用して、次のような送信ボタンから追加/編集する場合

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

その後、私たちは使用すべきではありません

isset($_POST['edit_id'])

bcoz edit_idは、ページを追加する場合でも編集する場合でも常に設定されます。代わりに、以下の条件をチェックする必要があります。

!empty($_POST['edit_id'])

以前の投稿が送信されましたbcoz私は誤ってEnterキーを押しました。これが私の完全な回答です...なぜ反対票を投じるのですか?:(
diEcho 2010

0
  • PHP Webサイトから、empty()関数を参照してください。

空ではなくゼロ以外の値があるFALSEかどうかvarを返します。

それは知っておくと良いことです。つまり、この関数を使用するとNULL、から0までのすべてが返されます。TRUEempty()

  • isset()関数が返すものの説明は次のとおりです。

存在するTRUE場合varは戻ります。FALSEさもないと。

つまり、存在しない変数(または厳密にNULL値を持つ変数)のみが関数で返さFALSEisset()ます。であるかどうかにかかわらず、あらゆるタイプの値を持つすべての変数は0、空のテキスト文字列などを返しTRUEます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.