2013-06-02 46 views
10

我通過幾個類似的問題瀏覽,但他們都只是說出事實:爲什麼PHP在[寬鬆地]比較它們之前將兩個數字串轉換爲數字?

If ... comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.

好吧,我知道了。它解釋了'00001' == '1'返回TRUE時什麼正在進行。

現在的問題是:爲什麼 PHP是這樣做的?
探測字符串爲數字的原因是什麼?爲什麼我們不能只比較兩個字符串?

我可以很好地理解,如果兩個操作數具有不同類型,那麼需要進行轉換。但是爲什麼當它們都是字符串的時候會出現「usual math」?

+1

原因他們沒有從Perl提示。 :P這樣說起來容易得多,就像「'=='比較數字,'eq'比較詞法,'==='嚴格比較」。 (雖然如果我們有前兩個,後者可能永遠不需要使用,呃,也許是用物體) – cHao

回答

3

啊,終於我知道了。這對我來說很愚蠢。

比較不僅包括"is equal",還包括"less than""greater than"。對於後兩者來說,在比較之前投入數字操作數顯然是至關重要的,因爲數字通常以PHP的形式表示爲字符串,並且11必須大於9,即使兩者都存儲在字符串中。

所以,作爲compare_function()確實所有比較一次返回要麼1, 0, -1說,如果第一個操作數比第二大分別,等於或小於 - 嗯,這是相當解釋,爲什麼操作數是演員。

4

您可以比較兩個字符串。

"00001" === "1" // false 

記住==意味着相當於===意味着等於

我只能猜測,爲什麼出現這種情況是因爲在開始PHP努力是一種類型的少語,他們就成爲一個路線前鬆散類型的語言。

PHP最初是字符串處理器,允許在它內部使用一些腳本。由於網絡上的所有輸入都是文本性質的,因此在處理數字時,必須努力工作才能獲得文本輸入,以便表現得很健全。

我可能對此有錯,但我不相信顯式強制轉換數據類型的能力,在引入* val函數(如intval)等進入PHP 4之前就已經進入階段了,我認爲,像(int)之後就出現了。

對於非比較操作來說,它非常容易,因爲它們都有一個與它們相關的類型(+ -/*全部處理數字,而處理字符串),所以在這些情況下應該如何處理事情的清晰路徑很明顯。

但是通過變量之間的等式或等價性檢查,唯一的方法就是將所有看起來像數字的東西都看作一個數字,因爲當時唯一可以得到的方法是通過外部方法將其作爲字符串,並沒有辦法使其它。

+0

我知道我會得到很多答案。 SO太tooooo直接:) –

+2

@Orangepill - 但他的問題是'爲什麼?' – vidit

+0

@YourCommonSense更好嗎? – Orangepill

3

因爲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> 

如果用戶輸入10001,你能指望在這兩種情況下,打印? YesNO

答案很清楚。我們期望看到Yes。所以這是why PHP does so 如果出於任何原因難得,我們要肯定它們進行比較,那麼我們就應該改變=====

+0

增加了Upvote是因爲許多設計決定,特別是「1」和「00001」,「(int)1」和「(float)1.0」之間的等同性是由於HTTP僅支持字符串而引起的。 PHP試圖減輕開發人員在「僅限字符串」的世界中的類型雜耍。 – KyleWpppd

相關問題