empty()
PHP 有在使用函数时将 (int)0 和 (string)"0" 评估为空的习惯。如果您期望数值或字符串值为 0,这可能会产生意想不到的结果。如何“修复”它以仅对空对象、数组、字符串等返回 true?
13 回答
这对我不起作用。
if (empty($variable) && '0' != $variable) {
// Do something
}
我改为使用:
if (empty($variable) && strlen($variable) == 0) {
// Do something
}
empty()
由于您描述的原因,我很少使用。它混淆了合法价值与空虚。也许是因为我在 SQL 中做了很多工作,但我更喜欢用它NULL
来表示没有值。
PHP 有一个函数is_null()
可以测试变量或表达式是否为NULL
.
$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n";
else print "integer 0 foo is not null!\n";
$foo = "0";
if (is_null($foo)) print "string '0' is null!\n";
else print "string '0' is not null!\n";
$foo = "";
if (is_null($foo)) print "string '' is null!\n";
else print "string '' is not null!\n";
$foo = false;
if (is_null($foo)) print "boolean false is null!\n";
else print "boolean false is not null!\n";
您还可以使用完全等于运算符===
进行类似的测试:
if ($foo === null) print "foo is null!\n";
如果$foo
is则为真NULL
,但如果为false
、零""
、等则不成立。
“0”在 PHP 中总是被认为是假的(或空的),它确实很有意义(我不会在这里争论)。如果您也想让零评估为真,请使用strlen($value)
.
我总是添加到我的代码库中
function is_blank($value) {
return empty($value) && !is_numeric($value);
}
并使用它而不是empty()。它解决了将零(int、float 或 string)保持为非空的问题。
请参阅2011 年 5 月添加的http://www.php.net/manual/en/function.empty.php#103756 。
“固定”是一种观点。另一种方法是假设它没有“损坏”,并学会按照有意设计的方式使用它。
鉴于您描述的问题,最好的办法是收紧您的代码,这样变量就不能进入不确定的类型状态。否则,您需要使用 gettype() 来测试数据类型。
一般来说,您希望使用三等号运算符来确定值何时真正为空或假。这更具体,结果总是完全按预期返回。
创建一个单独的函数来执行您可以在一行代码中执行但使用不同的运算符似乎过于复杂并增加了额外的混淆。
此外,许多程序员倾向于使用 0 或空字符串来表示不存在的值,但使用空值表示真正不存在的任何值(无论类型如何)更正确(我觉得更好的做法) -存在。
您正在尝试将empty()
其用于不打算用于的东西。就个人而言,我认为它的行为来自 PHP 中较旧的编程范例,它可能会被淘汰。
相反,让您的检查更加明确。与其检查该值是否无用,不如检查它是否有用。例如,如果您想要一个数组,请检查它是否为数组 ( is_array()
) 而不是检查它是否为字符串。
此外,您可以依靠 all$_POST
和$_GET
variables 都是字符串这一事实,因此您可以与 "" 进行比较,或检查strlen() == 0
.
我用它来检测空虚:
'' --> true
'0' --> false
0 --> false
功能:
function is_empty_or_zero($str) {
return (is_null($str) || ($str === ''));
}
我创建了IsEmpty()
一个简洁的快速函数。
function IsEmpty($mData) {
return is_int($mData) ? false :
is_string($mData) ? $mData=="" :
empty($mData);
}
if ( is_int($val) || !empty($val) ) {;}
我使用ord
函数来检查传递的值是否为空。
/*
* SPACE is not empty - Please do trim before using this function for your own purpose
* var_dump(is_having_value(0)); // true
var_dump(is_having_value(0000)); // true
var_dump(is_having_value(" 0")); // true
var_dump(is_having_value("")); // false
var_dump(is_having_value(" ")); // true
var_dump(is_having_value('\t')); // true
var_dump(is_having_value('')); // false
var_dump(is_having_value('o')); // true
var_dump(is_having_value('O')); // true
var_dump(is_having_value('0')); //true
var_dump(is_having_value(null)); //false
var_dump(is_having_value()); //false
*/
function is_having_value($val = null) {
if (is_array($val) || is_object($val)):
$logic_empty = empty($val);
return !$logic_empty;
else:
$ascii = ord($val);
if ($ascii == 48 || $ascii = 0 || $ascii == 32):
return true;
else:
$logic_empty = empty($val);
return !$logic_empty;
endif;
endif;
}
如果你想要一个等价的empty($var)
which 在 var 是字符串“0”时返回 false,你可以使用:
if (($var ?? 0) != '')
这样做的原因是:
$var ?? 0
是 ternery 的快捷方式isset($var) ? $var : 0
。也就是说,如果左边的变量不存在,它会取右边的值,而不发出警告或通知,就像 isset() 或 empty() 一样。<value> != ''
当左值不是字符串时,对空字符串进行隐式转换。对于任何类似假的值,<value>
例如 null、false 或(数字)0,这将返回 false。但是,对于字符串“0”,这将返回 true,因为不会执行强制转换并且"0" != ""
为 true。
这个问题最有效的解决方案是测试变量是否为假,例如
if (!$variable_name) {echo $variable_name;}
变量是空还是空都没有关系,放入if条件时都等于false。