【问题标题】:isset vs empty vs is_nullisset vs empty vs is_null
【发布时间】:2012-09-11 18:35:14
【问题描述】:

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

$caption = $_REQUEST[$name_input_name];

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

【问题讨论】:

  • FWIW,对于其他阅读此问题的人,如果 is_null($caption)empty($caption)!isset($caption) 中的所有三个都继续执行设置 $file->error 的代码,那么这意味着 @987654326 @ 是 null -- 可以通过 var_dump($caption) 发现。所以这个问题并不是关于这三者之间的区别——尽管答案对于解释区别很有用。
  • 看在上帝的份上,请使用 POST 或 GET,除非您明确必须这样做,否则不要同时使用。

标签: php


【解决方案1】:

如果变量未设置,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; 定义了一个变量,但没有为它分配任何值,但这是错误的。变量 $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 等。将像用户定义的函数一样调用,操作码为INIT_FCALL_BY_NAME/DO_FCALL_BY_NAME 等。

/* {{{ proto bool is_null(mixed var)
   Returns true if variable is null
   Warning: This function is special-cased by zend_compile.c and so is usually bypassed */
PHP_FUNCTION(is_null)
{
    php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_NULL);
}

【讨论】:

    【解决方案2】:

    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;
    }
    

    【讨论】:

    • 无论我是否输入标题,您建议的代码仍然返回错误。
    • 我怀疑您的应用程序中还有其他问题导致了问题。错误报告是否开启?
    • "empty() 将检查变量是否为空," - 不正确。 php.net/manual/en/types.comparisons.php
    • 我认为可能有比 isset() 检查设置、空检查为空和 is_null 检查为空更好的解释。
    • 注意:要检查的是$arr['key'] === null - 始终先检查isset(),然后检查is_null()。跨度>
    【解决方案3】:

    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

    如果您想检查除了nullundefined 之外是否还有任何 值,请使用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
    }
    

    【讨论】:

      【解决方案4】:

      isset()

      来自 PHP 手册 – isset():

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

      也就是说,只有当变量不为空时才返回true。

      空()

      来自 PHP 手册 – empty():

      empty — 判断一个变量是否为空

      也就是说,如果变量为空字符串,则返回true,false,array(),NULL,“0?,0”和未设置的变量。

      is_null()

      来自 PHP 手册 – is_null():

      is_null — 判断变量是否为 NULL

      换句话说,只有当变量为空时才返回true。 is_null()isset() 是相反的,区别在于 isset() 可以应用于未知变量,而 is_null() 只能应用于已声明的变量。

      【讨论】:

      【解决方案5】:

      我认为您打算使用 isset 您将其分配给某物之前:

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

      【讨论】:

      • 同意,我也会远离 $_REQUEST,具体情况具体说明。
      • @minitech 这行不通。当我输入名称时,它仍然返回错误,请输入标题。
      • @wes,我应该用什么来代替 $_REQUEST?
      • 好的...也用 $name_input_name 做一个 isset。它是 $_GET 还是 $_POST,你应该知道它是什么。我不喜欢它,因为它包含 $_COOKIE,它不是提交参数,只是将所有内容混为一谈。
      • @user1605871:等等……你是说'name_input_name'而不是$name_input_name吗?即您的字段是否名为 name_input_name,或者您是否有一个名为 $name_input_name 的变量?
      【解决方案6】:

      很难区分isset()is_null()empty()。它比我们想相信的更微妙。

      既然用文字很难清楚地解释差异,我建议看看this page:有一个包含每个功能的行为的详细表格。它清楚而全面地解释了这些差异。

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

      【讨论】:

        【解决方案7】:

        Here is很好的解释:

        【讨论】:

          【解决方案8】:

          我用strlen统计字符数

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

          【讨论】:

            【解决方案9】:

            你可以试试这个:

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

            注意:$_REQUEST 是一个全局数组,将数据存储在 key=>value 对中。将“name_input_name”视为从服务器提取的值。

            如果 name_input_name 设置为某个值,代码将跳过 if 块并将值存储到变量 $caption。

            【讨论】:

              【解决方案10】:

              我写了这个 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>
              

              【讨论】:

              • 欢迎来到 SO 并感谢您回答问题 :) 但是,请留下一些关于您所做的事情和原因的解释,以便 OP 更好地理解它。
              【解决方案11】:

              is_null 是 isset 的对偶,但 isset 在变量为 null 时不打印通知。

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

              【讨论】:

                【解决方案12】:

                参考:different between isset, is_null, empty in PHP

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

                【讨论】:

                  【解决方案13】:
                  1. isset() — 确定一个变量是否已设置而不是 NULL

                  2. empty() - 判断变量是否为空。

                  3. is_null() - 判断一个变量是否为空

                  【讨论】:

                    【解决方案14】:

                    在这些php函数中empty(),isset() &amp; is_null主要是用来测试变量的,但是每个函数都有不同的functionists。

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

                    【讨论】:

                    • 不是答案,而是评论。
                    猜你喜欢
                    • 2013-12-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-01-14
                    • 2018-02-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-11-03
                    相关资源
                    最近更新 更多