PHP检查字符串是否为空的最佳方法

41

我看到很多PHP代码都使用以下方法来检查字符串是否有效:

$str是一个字符串变量。

if (!isset($str) || $str !== '') {
  // do something
}

我更喜欢只做

if (strlen($str) > 0) {
  // something
}

第二种方法有什么可能出错的地方吗?我需要注意哪些强制类型转换问题吗?


4
好的,以下是翻译的内容:Um.. http://php.net/manual/en/function.empty.php?嗯……http://php.net/manual/en/function.empty.php? - Marwelln
好建议。我应该注意包含尾随空格的字符串。 - Yada
1
是的,会抛出错误,如果$str未定义。 - Your Common Sense
2
你在第二种方法中也假设$str已经被定义 - 如果没有,你会得到一个“未定义变量”的通知。而第一种方法中使用isset()来检查这个问题。 - richsage
@richsage 不是isset(),而是empty()。 - Your Common Sense
显示剩余3条评论
9个回答

50
由于PHP将包含零('0')的字符串视为空,因此使empty()函数成为不适合的解决方案。
相反,测试变量是否显式不等于空字符串: $stringvar !== '' 正如OPGras 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, while strlen() will not.


17
是的。考虑到字符串'0',empty()函数将返回true,而strlen()函数则不会。 - JYelton
12
这比 strlen( $str ) > 0 更糟糕,因为它认为 "0" 是一个空字符串。 - Jesse
“更糟糕”取决于操作者的要求。如果“0”应被视为空,则此方法并不理想。这只是一种替代建议。然而,在许多情况下,“0”可能就像空一样。这是情境相关的。 - JYelton
6
我不建议使用这种方法,因为字符串值"0"被视为空。 - Jake Wilson
1
@ToolmakerSteve 我已经编辑了这个(再次),希望避免任何新手发现9年前犯下的可怕错误。 - JYelton
显示剩余5条评论

16

如果$str可能未定义,您需要使用isset()

if (isset($str) && $str !== '') {
    // variable set, not empty string
}

使用!empty()会有一个重要的注意事项:字符串'0'被评估为false


此外,有时人们还想检查$str是否是一些falsy(如falsenull)之类的东西。上面的代码没有处理这个问题。这是一个罕见的情况,松散比较可能很有用:

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]

10
这将安全地检查一个只包含空格的字符串:
// 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));
}

3
这是什么意思:
if( !isset($str[0]) )
   echo "str is NULL or an empty string";

我在PHP手册的Antone Roundy的评论中找到了它。

我在这里发布它,因为我做了一些测试,似乎运行良好,但我想知道是否有我没有考虑到的副作用。欢迎在这里留下评论提出建议。


请注意,此方法还支持'0'falsenull(分别给出true,false,false),就像在我回答中的松散比较==''一样。 - Gras Double
@GrasDouble:没错,你说得对。问题在于字符串是'0'。 - Marco Demaio
有一些误解。我的意思是你的代码认为 '0' 是一个非空字符串,就像其他任何字符串一样。所以它实际上运行良好 :) - Gras Double

2

这个简单的老问题仍然很棘手。

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
}

2
根据 PHP empty() 文档 (http://ca1.php.net/empty):
在 PHP 5.5 之前,empty() 只支持变量;其他任何东西都会导致解析错误。换句话说,以下内容将不起作用:empty(trim($name))。 相反,请使用 trim($name) == false。

难怪我的空代码在PHP 5.3中总是返回错误。谢谢。 - eQ19

1
如果您的变量$str未定义,则您的strlen()方法将抛出异常。这就是首先使用isset()的整个目的。

0
修剪字符串也有助于处理带有空格的字符串。
if (isset($str) &&  trim($str) !== '') {
    // code
}


-3

我认为不是这样的,因为strlen(字符串长度)返回您的$ str变量的长度(整数)。因此,如果变量为空,则返回0。 0大于0吗?我不这么认为。 但我认为第一种方法可能会更安全一些。因为它检查变量是否已初始化,以及它是否为空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接