我通過幾個類似的問題瀏覽,但他們都只是說出事實:爲什麼PHP在[寬鬆地]比較它們之前將兩個數字串轉換爲數字?
好吧,我知道了。它解釋了當'00001' == '1'
返回TRUE
時什麼正在進行。
現在的問題是:爲什麼 PHP是這樣做的?
探測字符串爲數字的原因是什麼?爲什麼我們不能只比較兩個字符串?
我可以很好地理解,如果兩個操作數具有不同類型,那麼需要進行轉換。但是爲什麼當它們都是字符串的時候會出現「usual math」?
我通過幾個類似的問題瀏覽,但他們都只是說出事實:爲什麼PHP在[寬鬆地]比較它們之前將兩個數字串轉換爲數字?
好吧,我知道了。它解釋了當'00001' == '1'
返回TRUE
時什麼正在進行。
現在的問題是:爲什麼 PHP是這樣做的?
探測字符串爲數字的原因是什麼?爲什麼我們不能只比較兩個字符串?
我可以很好地理解,如果兩個操作數具有不同類型,那麼需要進行轉換。但是爲什麼當它們都是字符串的時候會出現「usual math」?
啊,終於我知道了。這對我來說很愚蠢。
比較不僅包括"is equal"
,還包括"less than"
和"greater than"
。對於後兩者來說,在比較之前投入數字操作數顯然是至關重要的,因爲數字通常以PHP的形式表示爲字符串,並且11必須大於9,即使兩者都存儲在字符串中。
所以,作爲compare_function()
確實所有比較一次返回要麼1, 0, -1
說,如果第一個操作數比第二大分別,等於或小於 - 嗯,這是相當解釋,爲什麼操作數是演員。
您可以比較兩個字符串。
"00001" === "1" // false
記住==
意味着相當於===
意味着等於
我只能猜測,爲什麼出現這種情況是因爲在開始PHP努力是一種類型的少語,他們就成爲一個路線前鬆散類型的語言。
PHP最初是字符串處理器,允許在它內部使用一些腳本。由於網絡上的所有輸入都是文本性質的,因此在處理數字時,必須努力工作才能獲得文本輸入,以便表現得很健全。
我可能對此有錯,但我不相信顯式強制轉換數據類型的能力,在引入* val函數(如intval)等進入PHP 4之前就已經進入階段了,我認爲,像(int)
之後就出現了。
對於非比較操作來說,它非常容易,因爲它們都有一個與它們相關的類型(+ -/*全部處理數字,而處理字符串),所以在這些情況下應該如何處理事情的清晰路徑很明顯。
但是通過變量之間的等式或等價性檢查,唯一的方法就是將所有看起來像數字的東西都看作一個數字,因爲當時唯一可以得到的方法是通過外部方法將其作爲字符串,並沒有辦法使其它。
我知道我會得到很多答案。 SO太tooooo直接:) –
@Orangepill - 但他的問題是'爲什麼?' – vidit
@YourCommonSense更好嗎? – Orangepill
因爲PHP爲最終用戶生產產品,而不是針對應用程序開發人員。 所以,當你產生這樣的產品象下面這樣:
if (isset($_POST['submit'])){
if ($_POST['myinput'] == "1") echo 'Yes'; //or == 1
else echo 'NO';
}
?>
<form name="myform" method="POST" action="">
<input name="myinput">
<input name="submit" type="submit">
</form>
如果用戶輸入1
或0001
,你能指望在這兩種情況下,打印? Yes
或NO
?
答案很清楚。我們期望看到Yes
。所以這是why PHP does so
如果出於任何原因難得,我們要肯定它們進行比較,那麼我們就應該改變==
到===
增加了Upvote是因爲許多設計決定,特別是「1」和「00001」,「(int)1」和「(float)1.0」之間的等同性是由於HTTP僅支持字符串而引起的。 PHP試圖減輕開發人員在「僅限字符串」的世界中的類型雜耍。 – KyleWpppd
原因他們沒有從Perl提示。 :P這樣說起來容易得多,就像「'=='比較數字,'eq'比較詞法,'==='嚴格比較」。 (雖然如果我們有前兩個,後者可能永遠不需要使用,呃,也許是用物體) – cHao