如果我理解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)得到满足。
答案 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,从而允许空值。