简体   繁体   中英

PHP best way to check whether a string is empty or not

I've seen a lot of php code that does the following to check whether a string is valid by doing:

$str is a string variable.

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

I prefer to just do

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

Is there any thing that can go wrong with the second method? Are there any casting issues I should be aware of?

Since PHP will treat a string containing a zero ('0') as empty, it makes the empty() function an unsuitable solution.

Instead, test that the variable is explicitly not equal to an empty string:

$stringvar !== ''

As the OP and Gras Double and others have shown, the variable should also be checked for initialization to avoid a warning or error (depending on settings):

isset($stringvar)

This results in the more acceptable:

if (isset($stringvar) && $stringvar !== '') {
}

PHP has a lot of bad conventions. I originally answered this (over 9 years ago) using the empty() function, as seen below. I've long since abandoned PHP, but since this answer attracts downvotes and comments every few years, I've updated it. Should the OP wish to change the accepted answer, please do so.

Original Answer:

 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.

You need isset() in case $str is possibly undefined:

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

Using !empty() would have an important caveat: the string '0' evaluates to false .


Also, sometimes one wants to check, in addition, that $str is not something falsy, like false or null [1]. The previous code doesn't handle this. It's one of the rare situations where loose comparison may be useful:

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

The above method is interesting as it remains concise and doesn't filter out '0' . But make sure to document your code if you use it.

Otherwise you can use this equivalent but more verbose version:

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


Of course, if you are sure $str is defined, you can omit the isset($str) from the above codes.


Finally, considering that '' == false , '0' == false , but '' != '0' , you may have guessed it: PHP comparisons aren't transitive (fun graphs included).


[1] Note that isset() already filters out null .

This will safely check for a string containing only whitespace:

// 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));
}

What about this:

if( !isset($str[0]) )
   echo "str is NULL or an empty string";

I found it on PHP manual in a comment by Antone Roundy

I posted it here, because I did some tests and it seems to work well, but I'm wondering if there is some side effect I'm not considering. Any suggestions in comments here would be appreciated.

According to PHP empty() doc ( http://ca1.php.net/empty ):

Prior to PHP 5.5, empty() only supports variables; anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

Instead, use trim($name) == false .

This simple old question is still tricky.

strlen($var) works perfectly ONLY if you're absolutely sure the $var is a string.

isset($var) and empty($var) result are based on type of the variable, and could be tricky at some cases (like empty string ""). View the table in this page for more details.

UPDATE

There are actually 2 cases for this question:

Case 1: You're sure that your variable is always going to be a "string":

In this case, just test the length:

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

Case 2: Your variable may and may not be a "string":

In this case, it depends on what you want to do. For me (most of the time), if it's not a string then I validate it as "false". You can do it this way:

if(is_string($var) && $var !== '') {// true only if it's a string AND is not empty
    // do something ...
}

And to make it shorter and in 1 condition instead of 2 (specially useful if you're testing more than 1 string in same if condition), I made it into function:

function isNonEmptyString($var) {
    return is_string($var) && $var !== '';
}


// Somewhere else..
// Reducing conditions to half
if(isNonEmptyString($var1) && isNonEmptyString($var2) && isNonEmptyString($var3)) {
    // do something
}

If your variable $str is not defined then your strlen() method will throw an exception. That is the whole purpose of using isset() first.

trimming the string will also help if there are string with white spaces.

if (isset($str) &&  trim($str) !== '') {
    // code
}

I think not, because strlen (string lenght) returns the lenght (integer) of your $str variable. So if the variable is empty i would return 0. Is 0 greater then 0. Don't think so. But i think the first method might be a little more safer. Because it checks if the variable is init, and if its not empty.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM