正确的使用方法!is_null()

时间:2014-01-22 19:59:09

标签: php

如果我理解is_null,那么PHP面向对象解决方案中的一个例子似乎有缺陷。

本书中的示例代码如下:

if (!is_null($required) && !is_array($required)) {
throw new Exception('The names of required fields must be an array, even if only one field is required.');
}

此代码应该测试var $ required不是NULL并且是一个数组。据我所知,如果未设置变量或is为NULL,则is_null()返回TRUE。那么,如果你在没有设置变量,NULL或不是数组的情况下尝试抛出异常,那么在该示例中否定is_null()是否有意义?抛出异常的唯一方法是if(true&& true)得到满足。

4 个答案:

答案 0 :(得分:3)

FROM:http://www.php.net/manual/en/language.types.null.php

  

如果出现以下情况,则认为变量为空

     

已为其分配常量NULL。

     

它尚未设置为任何值。

     

它已被取消()。

<?php
if(is_null($obj)){
    echo 'is null';
}

虽然$obj因为尚未注册而被视为NULL,但它仍会抛出Notice: undefined ...

正确使用if语句应首先检查变量是否存在,然后检查它是否是数组。

if (!isset($required) || !is_array($required)) {}

-OR -

if (empty($required) || !is_array($required)) {}

关于is_array()的好处是,如果$required为空,那么它不是数组,而是传递if子句。

isset()empty()都会确保变量存在。如果未通过其中任何一种方法,将退出if语句,并且不会返回任何错误。

答案 1 :(得分:1)

我很感谢所有的反馈,但不知怎的,我认为我的部分问题没有得到解决。使用逻辑AND测试变量的事实意味着要在if子句中运行Exception时两个语句都必须为TRUE。

但是,我不认为使用!is_null($ required)是正确的。本书中的示例代码测试变量以包含具有一对多值的数组。即使它有一个值,$ required变量(由于其他原因)仍然必须声明为具有单个值的数组。因此,如果$ required保持值为(int)5,则应抛出异常。如果未声明/实例化$ required变量,则应抛出异常。如果$ required变量保持NULL,则应抛出异常。这是此示例代码的逻辑失败的地方。使用@Calimero发布的在线php命令行,当$ required设置为NULL时,此逻辑失败。

如果$ required的值确实为NULL,则is_null返回TRUE,而不是使用!is_null($ required),而不应该使用is_null($ required)。因此,如果在$ required值恰好为NULL时否定is_null(),则逻辑AND操作的那一部分变为FALSE,因此异常永远不会运行,因为逻辑AND操作要求两个语句对于逻辑都为TRUE跳进花括号。这正是if条款应该首先捕获的内容。示例代码应该捕获未设置的$ required变量,而不是数组类型。

正如我在评论中提到的,isset()可能没有被使用,因为即使$ required变量是空字符串,带空格的字符串,空数组等,isset也会返回TRUE。

有人请确认我说的不是傻瓜。大声笑。

看看这个:(http://3v4l.org/QpVXq

答案 2 :(得分:0)

*的 * Is_null ** is_null是php构造语言,可用于测试变量是否设置为null。

   $myVariable = null;
    is_null($myVariable); // this returns true,because it is set to null

$myVariable = 10;
is_null($myVariable); // this returns false, cuz it is assigned to value


If the variable does not exist is_null will also return true, 
but with an error notice as it is not supposed
 to be used with uninitialized variables.

 //returns true and also notice with (undefined variable notice) 

    is_null($myNewVariable);// true (undefined variable notice) 

答案 3 :(得分:0)

如果代码是函数的一部分,则可能是函数允许空值,但如果传递的值并且它不是数组,则必须抛出异常。如果代码不是函数的一部分,它可能只是演示如何检测值是否只是一个数组,如果它不是null,从而允许空值。