[英]PHP best way to check whether a string is empty or not
我見過很多 php 代碼,它們執行以下操作來檢查字符串是否有效:
$str 是一個字符串變量。
if (!isset($str) || $str !== '') {
// do something
}
我更喜歡做
if (strlen($str) > 0) {
// something
}
第二種方法有什么問題嗎? 有什么我應該注意的鑄造問題嗎?
由於 PHP 會將包含零 ('0') 的字符串視為空字符串,這使得empty()
函數成為不合適的解決方案。
相反,測試變量是否顯式不等於空字符串:
$stringvar !== ''
正如OP和Gras Double和其他人所示,還應檢查變量的初始化以避免警告或錯誤(取決於設置):
isset($stringvar)
這導致更容易接受:
if (isset($stringvar) && $stringvar !== '') {
}
PHP 有很多不好的約定。 我最初使用empty()
函數回答了這個問題(9 多年前),如下所示。 我早就放棄了 PHP,但由於這個答案每隔幾年就會吸引反對票和評論,我已經更新了它。 如果 OP 希望更改已接受的答案,請這樣做。
原答案:
if(empty($stringvar)) { // do something }
如果要考慮,您還可以添加
trim()
以消除空格。編輯:
請注意,對於像“
0
”這樣的字符串,這將返回 true,而strlen()
則不會。
您需要isset()
以防$str
可能未定義:
if (isset($str) && $str !== '') {
// variable set, not empty string
}
使用!empty()
會有一個重要的警告:字符串'0'
計算結果為 false 。
此外,有時人們還想檢查一下, $str
不是false
,比如false
或null
[1]。 前面的代碼不處理這個。 這是松散比較可能有用的罕見情況之一:
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 比較不是可傳遞的(包括有趣的圖表)。
[1] 請注意, isset()
已經過濾掉了null
。
這將安全地檢查只包含空格的字符串:
// 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";
我在Antone Roundy的評論中在 PHP 手冊上找到了它
我把它貼在這里,因為我做了一些測試,它似乎工作得很好,但我想知道是否有一些我沒有考慮的副作用。 在這里評論中的任何建議將不勝感激。
根據 PHP empty() 文檔( http://ca1.php.net/empty ):
在 PHP 5.5 之前,empty() 只支持變量; 其他任何事情都會導致解析錯誤。 換句話說,以下內容將不起作用:empty(trim($name))。
相反,使用 trim($name) == false 。
這個簡單的老問題仍然很棘手。
strlen($var)
僅在您絕對確定 $var 是字符串時strlen($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 ...
}
為了使它更短,並在 1 個條件而不是 2 個條件下(如果您在相同的 if 條件下測試超過 1 個字符串特別有用),我將其設置為函數:
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 (string lenght) 返回 $str 變量的長度 (整數)。 因此,如果變量為空,我將返回 0。0 是否大於 0。不要這么認為。 但我認為第一種方法可能更安全一些。 因為它會檢查變量是否為 init,以及是否為空。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.