Zo te zien doet perl het ook op deze manier. Wellicht dat ze bij php niet zelf die keuze hebben gemaakt destijds

Maar python doet het bijv weer niet (zelfs 1 en "1" zijn daar niet equal, en "1a" is niet via int(...) naar int te casten).
EddoH schreef op dinsdag 19 april 2011 @ 10:55:
Precies! Daarom is de discussie of een implicit conversie bij een loose-typed taal 'vreemd' is ook wat scheef mijn insziens: het is onlosmakeend verbonden met het concept loose-typed. Wil je het voorkomen: strong-typed.
Je hebt hier gelijk, maar het punt van discussie is niet de impliciete conversie an sich. Maar het onvoorspelbare karakter dat php er aan geeft.
Waarom zijn deze drie allemaal equal aan elkaar?
PHP:
1
2
3
| $x = "2";
$y = "+2";
$z = "2.0"; |
't Zijn alledrie strings, dus er is geen implicit conversion nodig, toch levert een == op dat ze alledrie equal zijn. Als er nou nog een kale integer of float bij had gezeten, vooruit, maar dit gedrag? Als je dus strings helemaal veilig wilt vergelijken, dan moet je verplicht strcmp gebruiken, maar dat is weer niet toepasbaar op veel plekken waar php's vergelijking impliciet gebruikt wordt.
Check dit scriptje bijvoorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| $x = "2";
$y = "+2";
$z = "2.0";
var_dump($x == $y);
var_dump($x == $z);
var_dump($y == $z);
$ar = array();
$ar[$x] = 1;
$ar[$y] = 2;
$ar[$z] = 3;
var_dump($ar);
foreach(array($x, $y, $z) as $i)
{
switch($i)
{
case "2":
echo "$i = 2\n";
break;
case "+2":
echo "$i = +2\n";
break;
case "2.0":
echo "$i = 2.0\n";
break;
}
} |
Aangezien x, y en z allemaal equal zijn volgens php... zou je verwachten dat er 1 element in de array zit met waarde 3. Maar er zitten er drie in en als je de uitkomst van de array ziet, zou je verwachten dat uit die foreach weer drie verschillende uitkomsten komen, maar ze zijn allemaal 2 volgens de switch/case...
Kortom, dat 2 = 2.0 en 2 = "2" is prima. Maar "2" != "2.0", het zijn beide strings, dus er zou geen type cast voor moeten komen. Idem voor typecasts waarbij een deel van de waarde wordt weggegooid.