检查值是否已设置且为 null
我需要检查 value 是否定义为任何内容,包括 null。 isset
将 null 值视为未定义并返回 false
。以下面为例:
$foo = null;
if(isset($foo)) // returns false
if(isset($bar)) // returns false
if(isset($foo) || is_null($foo)) // returns true
if(isset($bar) || is_null($bar)) // returns true, raises a notice
请注意,$bar
未定义。
我需要找到一个满足以下条件的条件:
if(something($bar)) // returns false;
if(something($foo)) // returns true;
有什么想法吗?
I need to check if value is defined as anything, including null. isset
treats null values as undefined and returns false
. Take the following as an example:
$foo = null;
if(isset($foo)) // returns false
if(isset($bar)) // returns false
if(isset($foo) || is_null($foo)) // returns true
if(isset($bar) || is_null($bar)) // returns true, raises a notice
Note that $bar
is undefined.
I need to find a condition that satisfies the following:
if(something($bar)) // returns false;
if(something($foo)) // returns true;
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
IIRC,您可以使用
get_define_vars()
IIRC, you can use
get_defined_vars()
for this:如果您正在处理可能值为 NULL 的对象属性,您可以使用:
property_exists()
而不是
isset()
If you are dealing with object properties which might have a value of NULL you can use:
property_exists()
instead ofisset()
请参阅 最佳方法测试 PHP 中变量是否存在; isset() 显然被破坏了
See Best way to test for a variable's existence in PHP; isset() is clearly broken
我在寻找数组的解决方案时发现了这个主题。检查是否存在包含 NULL 的数组元素,这种构造帮助了我
I found this topic when I was looking for a solution for an array. to check for the presence of an array element that contains NULL, this construction helped me
我发现
compact
是一个忽略未设置变量的函数,但确实作用于设置为null
的变量,所以当你有一个很大的本地符号表时,我想你可以得到比使用array_key_exists('foo', compact('foo'))
检查array_key_exists('foo', get_define_vars())
更有效的解决方案:更新
从 PHP 7.3 开始 compact() 将发出通知未设置值,因此不幸的是此替代方案不再有效。
I have found that
compact
is a function that ignores unset variables but does act on ones set tonull
, so when you have a large local symbol table I would imagine you can get a more efficient solution over checkingarray_key_exists('foo', get_defined_vars())
by usingarray_key_exists('foo', compact('foo'))
:Update
As of PHP 7.3 compact() will give a notice for unset values, so unfortunately this alternative is no longer valid.
以下作为 PHP 扩展编写的代码等效于 array_key_exists($name, get_define_vars()) (感谢 Henrik 和 Hannes)。
The following code written as PHP extension is equivalent to array_key_exists($name, get_defined_vars()) (thanks to Henrik and Hannes).
这里有一些使用 xdebug 的愚蠢解决方法。 ;-)
Here some silly workaround using xdebug. ;-)
在我的例子中,我有以下代码:
如果它返回 null,它就会失败,因为
GetCachedInstanceFromDb()
会被多次调用。这一切都是因为即使该属性被显式设置为 Null,isset()
也会返回 false。因此,我必须进行以下更改:
声明初始值设置为 False 的属性;
检查当前变量值时使用严格(类型安全)比较;
In my case I had the following code:
And it failed in a way that
GetCachedInstanceFromDb()
got called multiple times if it returned null. All becauseisset()
would return false even if the property was explicitly set to Null.So, I had to do the following changes:
Declare the property with initial value set to False;
Use strict (type-safe) comparison when checking for the current variable value;
您可以使用 is_null 和 空 而不是 isset()。如果变量不存在,Empty 不会打印错误消息。
You could use is_null and empty instead of isset(). Empty doesn't print an error message if the variable doesn't exist.
冒着被否决的风险,我什至都不会打扰 - 显然 PHP 希望您在逻辑上将 NULL 和 Undef 视为相同。我刚刚运行它 - 我创建了一个函数:
检查 isset (处理 null 和 undef)、“”和 array()。请注意,这是故意不处理虚假问题;只是空的。的& 'reference-izer' 允许传递变量,即使未定义也不会出现错误消息,并且如果您首先检查 isset 并返回 false,则可以在没有错误的情况下对“”和 array() 进行下一次检查。
下一个函数利用了这个函数,并在您要使用的地方使用
,即:
它只具有条件:
顺便说一句,这些函数与对象引用、数组索引、$_GET、$_POST 等一起使用。
At risk of being downvoted, I wouldn't even bother - clearly PHP wanted you to logically think of NULL and Undef as the same. I just ran with it - I created a function:
that checks for isset (handles both null and undef), "", and array(). Note that this is purposefully not dealing with falseness; just empty. The & 'reference-izer' allows the variable to be passed even though undefined without an error message, and if you check for isset and return false first, your next checks against "" and array() can be made without error.
The next function takes advantage of this function and is used where you would use
and that is:
which just has the condition:
BTW, these work with object references, array indexes, $_GET, $_POST, etc..
is_null($bar)
返回 true,因为它根本没有值。或者,您可以使用:检查
$bar
是否已定义,并且仅在以下情况下返回 true:is_null($bar)
returns true, since it has no values at all. Alternatively, you can use:to check if
$bar
is defined and will only return true if: