我看到很多PHP代码都使用以下方法来检查字符串是否有效:
$str是一个字符串变量。
if (!isset($str) || $str !== '') {
// do something
}
我更喜欢只做
if (strlen($str) > 0) {
// something
}
第二种方法有什么可能出错的地方吗?我需要注意哪些强制类型转换问题吗?
我看到很多PHP代码都使用以下方法来检查字符串是否有效:
$str是一个字符串变量。
if (!isset($str) || $str !== '') {
// do something
}
我更喜欢只做
if (strlen($str) > 0) {
// something
}
第二种方法有什么可能出错的地方吗?我需要注意哪些强制类型转换问题吗?
empty()
函数成为不适合的解决方案。$stringvar !== ''
正如OP和Gras Double和其他人所示,还应检查变量是否已初始化以避免警告或错误(取决于设置):
isset($stringvar)
这导致更可接受的结果:if (isset($stringvar) && $stringvar !== '') {
}
PHP有很多不好的惯例。我最初使用empty()
函数回答了这个问题(9年前),如下所示。我已经放弃PHP很久了,但由于这个回答每隔几年就会吸引负评和评论,所以我更新了它。如果发帖人希望更改接受的答案,请这样做。
原始答案:
if(empty($stringvar)) { // do something }
You could also add
trim()
to eliminate whitespace if that is to be considered.Edit:
Note that for a string like '
0
', this will return true, whilestrlen()
will not.
empty()
函数将返回true,而strlen()
函数则不会。 - JYeltonstrlen( $str ) > 0
更糟糕,因为它认为 "0"
是一个空字符串。 - Jesse"0"
被视为空。 - Jake Wilson如果$str
可能未定义,您需要使用isset()
:
if (isset($str) && $str !== '') {
// variable set, not empty string
}
使用!empty()
会有一个重要的注意事项:字符串'0'
被评估为false。
此外,有时人们还想检查$str
是否是一些falsy(如false
或null
)之类的东西。上面的代码没有处理这个问题。这是一个罕见的情况,松散比较可能很有用:
if (isset($str) && $str != '') {
// variable set, not empty string, not falsy
}
上述方法很有趣,因为它保持简洁,并且不过滤掉'0'
。但是如果您使用它,请确保记录您的代码。
否则,您可以使用下面这个等效但更冗长的版本:
if (isset($str) && (string) $str !== '') {
// variable set, not empty string, not falsy
}
当然,如果你确定$str
已定义,你可以省略上面代码中的isset($str)
。'' == false
,'0' == false
,但'' != '0'
,你可能已经猜到了:PHP的比较不具有传递性(包含有趣的图表)。isset()
已经过滤掉null
。[1]// Determines if the supplied string is an empty string.
// Empty is defined as null or containing only whitespace.
// '0' is NOT an empty string!
function isEmptyString($str) {
return !(isset($str) && (strlen(trim($str)) > 0));
}
if( !isset($str[0]) )
echo "str is NULL or an empty string";
我在PHP手册的Antone Roundy的评论中找到了它。
我在这里发布它,因为我做了一些测试,似乎运行良好,但我想知道是否有我没有考虑到的副作用。欢迎在这里留下评论提出建议。
'0'
,false
,null
(分别给出true,false,false),就像在我回答中的松散比较==''
一样。 - Gras Double'0'
是一个非空字符串,就像其他任何字符串一样。所以它实际上运行良好 :) - Gras Double这个简单的老问题仍然很棘手。
strlen($var)
仅在您确信 $var 是一个字符串时才能完美工作。
isset($var)
和 empty($var)
的结果基于变量的类型,在某些情况下可能会很棘手(如空字符串 "")。查看此页面中的表格以获取更多详细信息。
更新
实际上,这个问题有两种情况:
情况1:您确定您的变量始终是一个“字符串”:
在这种情况下,只需测试长度:
if(strlen($str) > 0) {
// do something..
}
情况2:您的变量可能是也可能不是“字符串”:
在这种情况下,这取决于您想要做什么。对于我来说(大多数情况下),如果它不是字符串,那么我将其验证为“false”。您可以这样做:
if(is_string($var) && $var !== '') {// true only if it's a string AND is not empty
// do something ...
}
为了让代码更简洁,只需要一个条件而不是两个(如果您在同一个if条件中测试多个字符串,则特别有用),我将其制作成函数:
function isNonEmptyString($var) {
return is_string($var) && $var !== '';
}
// Somewhere else..
// Reducing conditions to half
if(isNonEmptyString($var1) && isNonEmptyString($var2) && isNonEmptyString($var3)) {
// do something
}
$str
未定义,则您的strlen()
方法将抛出异常。这就是首先使用isset()
的整个目的。if (isset($str) && trim($str) !== '') {
// code
}
我认为不是这样的,因为strlen(字符串长度)返回您的$ str变量的长度(整数)。因此,如果变量为空,则返回0。 0大于0吗?我不这么认为。 但我认为第一种方法可能会更安全一些。因为它检查变量是否已初始化,以及它是否为空。
$str
已经被定义 - 如果没有,你会得到一个“未定义变量”的通知。而第一种方法中使用isset()
来检查这个问题。 - richsage