ugrás a tartalomhoz

A PHP-ban tapasztalt feltétel hiba

plit · 2010. Nov. 19. (P), 15.46
Sziasztok

Lenne itt egy érdekesség amit nemrég vettem észre a feltételek kapcsán.
teszt:

<?php
var_dump(0 == '');   // bool(true)
var_dump(0 == "");   // bool(true)
var_dump(0 == "a");  // bool(true)
var_dump(0 == "aa"); // bool(true)
var_dump(0 == "b");  // bool(true)
var_dump(0 == 'a');  // bool(true)
var_dump(0 == 'b');  // bool(true)
var_dump(0 == '0');  // bool(true)
var_dump(0 == "1");  // bool(false)
var_dump(0 == 1);    // bool(false)
var_dump(0 == 0);    // bool(true)
?>
Az eredmény kicsit meglepő volt.

Felmerült kérdések:
- Hogyan vizsgálja a php a feltételeket
- Esetleg kasztolás megy végbe
- Hogyan tud összehasonlítani különböző típusú változókat
Ez valójában egy kérdésnek is vehető sőt az is csak kicsit boncolgattam.

Lehet hogy ezek triviális kérdés, de nem vagyok tisztába velük azért kérdezem őket.

Maga a php működése érdekelne.

Előre is kösz
 
2

Érdekes?

Poetro · 2010. Nov. 19. (P), 16.40
Ebben semmi érdekes nincs, a PHP így működik már több mint egy évtizede.
Érdemes elolvasni a Converting to boolean fejezetet, amire maga az if leírása is utal. És igen castolás történik. Erről is olvashatsz a hivatalos dokumentációban.
1

Dinamikus típusság

Török Gábor · 2010. Nov. 19. (P), 16.37
Annyival kiegészíteném Poetro válaszát, hogy ez nem PHP specifikus. Minden dinamikusan típusos nyelvnél – ahol értelmezett két különböző típusú érték összehasonlítása – az értelmezőnek valamit kezdenie kell ezzel a problémával. Ugyanilyen jelenséggel fogsz találkozni például JavaScript, Python vagy Lisp esetén is.
Hogyan tud összehasonlítani különböző típusú változókat
Nem a változóknak, hanem az értékeknek van típusa.
3

Pythonban ez pont nincs

dyuri · 2010. Nov. 19. (P), 17.25
Valoban, Pythonban is ossze tudsz hasonlitani kb. barmit barmivel, de csak a "kompatibilis" tipusokat fogja castolni (pl. str es unicode, vagy float es int), pont a stringet nem fogja szamma parseolni:
>>> 0 == "0"
False
>>> 0 == 0.0
True
# de
>>> 0 is 0.0
False
4

Típusosság erőssége

Török Gábor · 2010. Nov. 19. (P), 17.44
Igazad van. Én arra utaltam, hogy az összehasonlítás megtehető a dinamikus típusosság miatt, de hogy mi lesz belőle, azt már a típusság erőssége határozza meg. Ez Python esetén erős, PHP esetén gyenge. Lehet, hogy nem volt szerencsés a Pythont idekeverni.
5

Megállapítás

plit · 2010. Nov. 20. (Szo), 14.10

var_dump((int)"");                 // int(0)
var_dump((string)0 == (string)''); // bool(false)  
var_dump((int)0 == (int)"");       // bool(true)  
Tehát a php, ha int és string típusú értéket hasonlít össze és nincs castolás vagy típusellenőrzés(===) akkor intre fogja castolni.

Ja és köszönöm a hozzászólásokat.