簡體   English   中英

為什么 is_numeric() 在傳遞看似數字的字符串時返回 false?

[英]Why does is_numeric() return false when passed a seemingly numeric string?

我試圖理解 PHP 中的數字字符串。 我有以下代碼:

var_dump(5 * "10 abc");
var_dump(is_numeric("10 abc"));

這給了我 output:

int(50)
bool(false)

這讓我感到困惑,因為字符串“10 abc”似乎在第一個表達式中被解釋為數字字符串(因此 int(50) output 並且沒有關於使用非數字值的警告),但是當通過 is_numeric() function 它返回false,表明它實際上不是數字字符串。

我花了一些時間查看文檔以了解這種行為,但找不到任何具體的答案,有人可以幫忙解釋導致這種行為的原因嗎?

我知道 PHP 8.0.0 對被視為數字字符串的內容進行了一些更改,但這是 PHP 7.1.33 我現在正試圖理解。

“Saner numeric string” RFC 的 RFC 作者,在此處被 PHP 8.0 接受。

"10 abc"不是一個數字字符串,而是一個前導數字字符串,這意味着字符串的開頭看起來像一個數字,但它不是一個數字,因為在字符串中的某個點存在亂碼(這包括空格)。

因為is_numeric()根據 PHP 的定義檢查一個值是否被認為是數字(在 PHP 8.0 之前意味着前導空格后跟一個 + 或 - 號和 integer、普通十進制數或指數表示法中的數字) ,它將在僅被視為前導數字的字符串上返回false

但是,算術運算嘗試將其操作數轉換為適當的數字類型(int 或 float),因此"10 abc"被轉換為10 ,因為 PHP 會將前導數字字符串轉換為其前導數值。

更多“有趣”的細節和邊緣案例可以在 PHP RFC 的技術背景部分找到。

我認為理解您描述的行為的最簡單方法是僅僅因為 string不是 numeric ,這並不意味着它不能被強制或視為 number

你的第一行代碼

var_dump(5 * "10 abc");

將字符串視為數字,一旦遇到無效字符,它就會忽略之后的所有內容。

你的另一行代碼

var_dump(is_numeric("10 abc"));

實際上表現得更聰明,並像人類一樣問自己,我們在這里處理的是數字字符串嗎? 答案是否定的(因為那些相同的無效字符)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM