2014-11-04 118 views
5

我看到這個小一段代碼,是在迴避我的理解:瞭解PHP類型強制

<?php 

$a = '0e462097431906509019562988736854'; 
$b = '0e830400451993494058024219903391'; 

var_dump($a == $b); 

將輸出:

bool(true) 

據我所知,使用== PHP時將嘗試模糊對比,在類型之間默默地轉換以執行比較。我是不是的理解是爲什麼PHP似乎認爲這兩個字符串是一樣的。我會想,因爲$a$b是字符串,不需要進行任何類型轉換。

我不理解什麼?

回答

4

我認爲這篇文章解釋了它相當不錯:

Type-coercing comparison operators will convert numeric strings to numbers

只是在這裏引用的主要問題:

php language.operators.comparison,類型強制轉換比較運營商將迫使兩個操作數爲浮點數,如果他們兩個看起來像數字,即使他們都已經字符串:

其中strings均使用指數表示法,因此在實際「鬆散地」比較它們之前將其視爲數字字符串,進行寬鬆比較(==),強制這些stringsfloats

作爲最佳實踐,並防止意外的行爲,總是想用identity equality===),尤其strings

0

這是不是一個真正的答案,但如果你嘗試:

$a = '0e4620974319065090195629887368549'; 
$b = '0e8304004519934940580242199033918'; 
echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b); 

你得到:

布爾(真)

現在,如果您嘗試:

$a = '0e4620974319065090195629887368549'; 
$b = '1e8304004519934940580242199033918'; 
echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b); 

你得到:

INF

布爾(假)

我的猜測是,PHP轉換字符串浮動並提供了使用所獲得的花車,比較結果其中反正是不正確的,但那是另一回事。

+0

但是,爲什麼兩者都是字符串? – amphetamachine 2014-11-04 17:58:09

0

在官方文檔,平等介乎2個vairiables試驗進行如下:

$a == $b # Equal TRUE if $a is equal to $b after type juggling. 

例子:

$a = 13; # integer type 
$b = "13"; # string type 
var_dump($a == $b); # will say TRUE, because juggling was made 
var_dump($a === $b); # will say FALSE, because PHP will also evaluate the type of variables :) 
0

PHP處理嘗試轉換,因爲字符串以0開始爲float類型時,在0之後停止,因爲下一個字符不是數字。當您使用類型強制轉換科學記數法爲整數時會發生同樣的事情:

$x = (float)"12E-1x"; // $x == 1.2 
$x = (int)"12E-1x"; // $x == 12 (stops at E because it's not an integer)