isset vs empty vs is_null

时间:2012-09-11 18:35:14

标签: php

我正在尝试编写一个脚本,当用户上传文件但没有输入名称时,会返回错误。我尝试过使用is_null,empty和isset,它们都不起作用。例如,在下面,即使输入了名称,is_null也会返回错误。有人可以帮忙吗?

    $caption = $_REQUEST[$name_input_name];

 if(is_null($caption))
 {
 $file->error = 'Please Enter a Title';
 return false;
 }

14 个答案:

答案 0 :(得分:11)

isset()将检查变量是否已设置,即

<?php

echo isset($var); // false

$var = 'hello';

empty()将检查变量是否为空,即

<?php

$emptyString = '';

echo empty($emptyString); // true

is_null()会检查NULL与空的不同,因为它设置为NULL而不是空字符串。 (NULL可能是一个令人困惑的概念)

由于您的标题是字符串,我认为您希望使用empty()

if (!isset($_REQUEST[$name_input_name]) || empty($_REQUEST[$name_input_name])) {
    $file->error = 'Please Enter a Title';
    return false;
}

答案 1 :(得分:7)

如果未设置变量,

is_null()会发出警告,但isset()empty()不会。

$a - variable with not null value (e.g. TRUE)
$b - variable with null value. `$b = null;`
$c - not declared variable
$d - variable with value that cast to FALSE (e.g. empty string, FALSE or empty array)
$e - variable declared, but without any value assigned
$a->a - declared, but not assigned object property. (`public $a;`)
A::$a - declared, but not assigned static class property.

         |   $a  |   $b  |   $c  |   $d  |   $e  | $a->a | A::$a |
---------+-------+-------+-------+-------+-------+-------+-------+
is_null()| FALSE | TRUE  |TRUE*W | FALSE | TRUE*W| TRUE  | TRUE  |
---------+-------+-------+-------+-------+-------+-------+-------+
isset()  | TRUE  | FALSE | FALSE | TRUE  | FALSE | FALSE | FALSE |
---------+-------+-------+-------+-------+-------+-------+-------+
empty()  | FALSE | TRUE  | TRUE  | TRUE  | TRUE  | TRUE  | TRUE  |
---------+-------+-------+-------+-------+-------+-------+-------+
null === | FALSE | TRUE  |TRUE*W | FALSE | TRUE*W| TRUE  | TRUE  |
---------+-------+-------+-------+-------+-------+-------+-------+
null ==  | FALSE | TRUE  |TRUE*W | TRUE  | TRUE*W| TRUE  | TRUE  |
---------+-------+-------+-------+-------+-------+-------+-------+

TRUE*W - function return TRUE, but same time emits WARNING.

empty() function documentation page上,您可以阅读:

  

以下内容被认为是空的:

     

....

     

$变种; (声明的变量,但没有值)

代码$var;定义变量可能会产生误导,但不会为其赋值,但这是错误的。变量$var仍未定义,类型识别函数,如果is_null()作为参数传递,$var会发出警告。

但它不适合未结算的类或对象属性。在不指定值的情况下声明它们会自动指定NULL。

UPD PHP 7.4中的类型属性默认情况下不由NULL分配。如果您没有为它们设置任何值,则将它们视为未分配。

一些低级别描述:

isset()empty()是核心函数,将根据zval类型直接编译为特定操作码:

ZEND_ISSET_ISEMPTY_THIS
ZEND_ISSET_ISEMPTY_CV
ZEND_ISSET_ISEMPTY_VAR
ZEND_ISSET_ISEMPTY_DIM_OBJ
ZEND_ISSET_ISEMPTY_PROP_OBJ
ZEND_ISSET_ISEMPTY_STATIC_PROP

此外,他们将使用相同的函数zend_compile_isset_or_empty

进行编译

函数is_null()type recognizer function,如is_numericis_recourceis_bool等。并且将像用户定义的函数一样调用opcodes {{ 1}}等等。

INIT_FCALL_BY_NAME/DO_FCALL_BY_NAME

答案 2 :(得分:6)

isset()函数

从PHP手册 - isset():

  

isset - 确定变量是否已设置且不是NULL

换句话说,仅当变量不为空时才返回true。

空()

从PHP手册 - 空():

  

empty - 确定变量是否为空

换句话说,如果变量是空字符串,false,array(),NULL,“0?,0和未设置的变量”,它将返回true。

is_null()

来自PHP手册 - is_null():

  

is_null - 查找变量是否为NULL

换句话说,仅当变量为null时才返回true。 is_null()isset()相反,但有一个区别是isset()可以应用于未知变量,但is_null()仅适用于声明的变量。

答案 3 :(得分:4)

我认为您打算在之前使用isset 将其分配给某些内容:

if(!isset($_REQUEST[$name_input_name]))
{
    $file->error = 'Please Enter a Title';
    return false;
}

$caption = $_REQUEST[$name_input_name];

答案 4 :(得分:4)

PHP empty() vs is_null() vs isset()

            +-------+-------+-------+-------+-------+--------------+
            |  ""   | "foo" | NULL  | FALSE |   0   | undefined    |
+-----------+-------+-------+-------+-------+-------+--------------+
| empty()   | TRUE  | FALSE | TRUE  | TRUE  | TRUE  | TRUE         |
| is_null() | FALSE | FALSE | TRUE  | FALSE | FALSE | TRUE (ERROR) |
| isset()   | TRUE  | TRUE  | FALSE | TRUE  | TRUE  | FALSE        |
+-----------+-------+-------+-------+-------+-------+--------------+

如果您要检查除null undefined 以外是否还有任何值,请使用isset($var)
(因为!is_null()会针对未定义的变量生成警告。)

如果要检查该值是非空白文本还是包含零的任何数字,则将变得更加棘手:

if (!empty($v) || (isset($v) && ($v === 0 || $v === '0'))) {
    // $v is non-blank text, true, 0 or '0'
    // $v is NOT an empty string, null, false or undefined
}

答案 5 :(得分:2)

要获得isset()is_null()empty()之间的区别并不容易。这比我们想像的要微妙得多。

因为,要用单词清楚地解释它们之间的区别并不容易,所以我建议看一下this page:有一个详细的表,其中包含每个函数的行为。它清楚而完整地解释了差异。

顺便说一句,我坚信,由于对行为的误解,许多PHP脚本都包含安全漏洞。

答案 6 :(得分:1)

Here is一个很好的解释:

enter image description here

答案 7 :(得分:0)

我使用strlen来计算字符数

 if (strlen($_REQUEST['name_input_name']) < 1) {
    $file->error = 'Please Enter a Title';
    return false;
}

答案 8 :(得分:0)

你可以试试这个:

if(!isset($_REQUEST['name_input_name']))
{
    $file->error = 'Please Enter a Title';
    return false;
}
$caption = $_REQUEST['name_input_name'];

注意:$ _REQUEST是一个全局数组,用于将数据存储在key =&gt;值对中。考虑&#34; name_input_name&#34;作为从服务器提取的值。

如果将name_input_name设置为某个值,则在阻止时将跳过代码并将值存储到变量$ caption。

答案 9 :(得分:0)

is_null是isset的对偶,但如果变量为null,则isset不会打印通知。

>$ciao;
>var_export(is_null($ciao));
>PHP Notice:  Undefined variable: ciao in php shell code on line 1
>true
>var_export(!isset($ciao));
>true

答案 10 :(得分:0)

引用以下内容:different between isset, is_null, empty in PHP

  • isset()表示已定义$ var且不为空
  • is_null()表示已定义$ var且为null。如果未定义,则抛出错误。
  • empty()是什么意思,否=> false,0、0.0,“”,“ 0”,,array()

答案 11 :(得分:0)

我写了这个php页面,希望会对您有所帮助。如果运行它,它将显示这些特定类型的变量与这些函数的交互作用(加上我为我自己创建的变量),并且还会使用==运算符将它们相互比较: https://pastebin.com/whPFMams

<!doctype html>
<html>
<head>
    <style>
    td.first{
        font-weight: bold;
    }
    h3 {
        text-align: center;
    }
    </style>
</head>
<body>
    <h3>FUNCTIONS COMPARISON</h3><br>
<pre>
<h4>Variables</h4>
class obj{};
$n;

Array:
"a" => -1,
"b" => 0,
"c" => 0.0,
"d" => '',
"e" => ' ',
"f" => '0',
"g" => "\0",
"h" => true,
"i" => false,
"j" => null,
"k" => array(), 
"l" => new obj(),
"m" => new stdClass(),
"n" => $n (undefined)

z = (undeclared)

<h4>My function</h4>
function isvalid($value,$strict=false){
    if( !is_null($value) && value!==false && (!empty($value) || $value == 0) ){
        if($strict)
            {
                if(is_bool($value) || is_array($value) || is_object($value))
                    {return false;}
                else
                    {return true;}
            }
        else
            {return true;}
    }
    else
        {return false;}
}


<h4>Var_dump</h4>
<?php
error_reporting(E_ERROR | E_PARSE);

class obj{};

function isvalid($value,$strict=false){
    if( !is_null($value) && $value!==false && (!empty($value) || $value == 0) ){
        if($strict)
            {
                if(is_bool($value) || is_array($value) || is_object($value))
                    {return false;}
                else
                    {return true;}
            }
        else
            {return true;}
    }
    else
        {return false;}
}


$n;
$values = [
"a" => -1,
"b" => 0,
"c" => 0.0,
"d" => '',
"e" => ' ',
"f" => '0',
"g" => "\0",
"h" => true,
"i" => false,
"j" => null,
"k" => array(), 
"l" => new obj(),
"m" => new stdClass(),
"n" => $n
//"z"
];


echo var_dump($values)."\n z = "; echo var_dump($z)."\n";

?>
</pre><br />
<table border = "1">
         <tr>
            <th>== and other</th>
            <?php 
            echo "<th>"; echo var_dump($values["a"]); echo "<br> : a = -1 </th>";
            echo "<th>"; echo var_dump($values["b"]); echo "<br> : b = 0 </th>";
            echo "<th>"; echo var_dump($values["c"]); echo "<br> : c = 0.0 </th>";
            echo "<th>"; echo var_dump($values["d"]); echo "<br> : d = '' </th>";
            echo "<th>"; echo var_dump($values["e"]); echo "<br> : e = ' ' </th>";
            echo "<th>"; echo var_dump($values["f"]); echo "<br> : f = '0' </th>";
            echo "<th>"; echo var_dump($values["g"]); echo "<br> : g = '/0' </th>";
            echo "<th>"; echo var_dump($values["h"]); echo "<br> : h = true </th>";
            echo "<th>"; echo var_dump($values["i"]); echo "<br> : i = false </th>";
            echo "<th>"; echo var_dump($values["j"]); echo "<br> : j = null </th>";
            echo "<th>"; echo var_dump($values["k"]); echo "<br> : k = empty array </th>";
            echo "<th>"; echo var_dump($values["l"]); echo "<br> : l = empty object (Notices with numbers)</th>";
            echo "<th>"; echo var_dump($values["m"]); echo "<br> : m = empty stdClass (Notices with numbers)</th>";
            echo "<th>"; echo var_dump($values["n"]); echo "<br> : n = undefined </th>";
            echo "<th>"; echo var_dump($z); echo "<br> : z = undeclared (Notices)</th>"; 
            ?>
         </tr>
         <?php
         foreach ($values as $key => $val){
            echo '
            <tr>
            <td class="first">'; echo var_dump($val); echo '<br> : '.$key.'</td>';
            foreach ($values as $key2 => $val2){
                echo '<td>'; echo $val==$val2 ? var_dump($val==$val2) : /*var_dump($val==$val2).*/''; echo'</td>';
            }
            echo '<td>'; echo $val==$z ? var_dump($val==$z) : /*var_dump($val==$z).*/''; echo'</td>';
            echo '</tr>';
         }
         //z
         echo '
            <tr>
            <td class="first">'; echo var_dump($z); echo '<br> : z (Notices)</td>';
            foreach ($values as $key2 => $val2){
                echo '<td>'; echo $z==$val2 ? var_dump($z==$val2) : /*var_dump($z==$val2).*/''; echo'</td>';
            }
            echo '<td>'; echo $z==$z ? var_dump($z==$z) : /*var_dump($z==$z).*/''; echo'</td>';
            echo '</tr>';
            
          //!empty || ==0
         echo '
            <tr>
            <td class="first"> !empty || ==0 </td>';
            foreach ($values as $key => $val){
                echo '<td>'; echo !empty($val) || $val==0 ? var_dump(!empty($val) || $val==0) : /*var_dump(!empty($val) || $val==0.*/''; echo'</td>';
            }
            echo '<td>'; echo !empty($z) || $z==0 ? var_dump(!empty($z) || $z==0) : /*var_dump(!empty($z) || $z==0).*/''; echo'</td>';
            echo '</tr>';                            
         
         //isvalid
         echo '
            <tr>
            <td class="first"> isvalid() </td>';
            foreach ($values as $key => $val){
                echo '<td>'; echo isvalid($val) ? var_dump(isvalid($val)) : /*var_dump(isvalid($val)).*/''; echo'</td>';
            }
            echo '<td>'; echo isvalid($z) ? var_dump(isvalid($z)) : /*var_dump(isvalid($z)).*/''; echo'</td>';
            echo '</tr>';  
            
         //isvalid strict
         echo '
            <tr>
            <td class="first"> isvalid(strict) </td>';
            foreach ($values as $key => $val){
                echo '<td>'; echo isvalid($val,true) ? var_dump(isvalid($val,true)) : /*var_dump(isvalid($val,true)).*/''; echo'</td>';
            }
            echo '<td>'; echo isvalid($z,true) ? var_dump(isvalid($z,true)) : /*var_dump(isvalid($z,true)).*/''; echo'</td>';
            echo '</tr>'; 
            
         //!is_null
         echo '
            <tr>
            <td class="first"> !is_null </td>';
            foreach ($values as $key => $val){
                echo '<td>'; echo !is_null($val) ? var_dump(!is_null($val)) : /*var_dump(!is_null($val)).*/''; echo'</td>';
            }
            echo '<td>'; echo !is_null($z) ? var_dump(!is_null($z)) : /*var_dump(!is_null($z)).*/''; echo'</td>';
            echo '</tr>';     
            
         //isset
         echo '
            <tr>
            <td class="first"> isset (No Notices)</td>';
            foreach ($values as $key => $val){
                echo '<td>'; echo isset($val) ? var_dump(isset($val)) : /*var_dump(isset($val)).*/''; echo'</td>';
            }
            echo '<td>'; echo isset($z) ? var_dump(isset($z)) : /*var_dump(isset($z)).*/''; echo'</td>';
            echo '</tr>';  
            
         //!empty
         echo '
            <tr>
            <td class="first"> !empty (No Notices) </td>';
            foreach ($values as $key => $val){
                echo '<td>'; echo !empty($val) ? var_dump(!empty($val)) : /*var_dump(!empty($val)).*/''; echo'</td>';
            }
            echo '<td>'; echo !empty($z) ? var_dump(!empty($z)) : /*var_dump(!empty($z)).*/''; echo'</td>';
            echo '</tr>';   
            
         // if
         echo '
            <tr>
            <td class="first"> if </td>';
            foreach ($values as $key => $val){
                echo '<td>'; echo $val ? var_dump(true) : /*var_dump(false).*/''; echo'</td>';
            }
            echo '<td>'; echo $z ? var_dump(true) : /*var_dump(false).*/''; echo'</td>';
            echo '</tr>';      
            
         ?>
         <tr>
            <th>functions</th>
            <?php 
            echo "<th>"; echo var_dump($values["a"]); echo "<br> : a = -1 </th>";
            echo "<th>"; echo var_dump($values["b"]); echo "<br> : b = 0 </th>";
            echo "<th>"; echo var_dump($values["c"]); echo "<br> : c = 0.0 </th>";
            echo "<th>"; echo var_dump($values["d"]); echo "<br> : d = '' </th>";
            echo "<th>"; echo var_dump($values["e"]); echo "<br> : e = ' ' </th>";
            echo "<th>"; echo var_dump($values["f"]); echo "<br> : f = '0' </th>";
            echo "<th>"; echo var_dump($values["g"]); echo "<br> : g = '/0' </th>";
            echo "<th>"; echo var_dump($values["h"]); echo "<br> : h = true </th>";
            echo "<th>"; echo var_dump($values["i"]); echo "<br> : i = false </th>";
            echo "<th>"; echo var_dump($values["j"]); echo "<br> : j = null </th>";
            echo "<th>"; echo var_dump($values["k"]); echo "<br> : k = empty array </th>";
            echo "<th>"; echo var_dump($values["l"]); echo "<br> : l = empty object (Notices with numbers)</th>";
            echo "<th>"; echo var_dump($values["m"]); echo "<br> : m = empty stdClass (Notices with numbers)</th>";
            echo "<th>"; echo var_dump($values["n"]); echo "<br> : n = undefined </th>";
            echo "<th>"; echo var_dump($z); echo "<br> : z = undeclared (Notices)</th>"; 
            ?>
         </tr>
      </table>
    <br>
    (Notices) : This line is full of Notices. <br>
    (Notices with numbers) : This line has Notices about number types interactions. <br>
    (No Notices) : This line has absolutely no Notices.
</body>
</html>

答案 12 :(得分:-1)

  1. isset() - 确定是否设置了变量而不是NULL

  2. empty() - 确定变量是否为空。

  3. is_null() - 确定变量是否为空

答案 13 :(得分:-2)

在这些PHP函数中empty(),isset() & is_null主要用于测试变量。但每个函数都有不同的功能主义者。

致谢:empty() , isset(), is_null()