PHP hádanka VII.: rovný a rovnější
Najdete všechny hodnoty, kterých může nabývat proměnná
$value, aby byla následující podmínka vyhodnocena kladně?
$value = ???
if ($value=="ahoj") echo 'rovnost platí';
Komentáře » přidat
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat
No?
Rovněž jsem na jiné řešení nepřišel. Tedy hodnoty:
A proč ta nula? Jsem Prostě Hloupý Programátor a tohle nevím.
hadam: nula je to proto ze (int)„ahoj“ == 0 == „ahoj“
jinak trojitej rovnase je lepsi na toto ;)
[10] řekl bych, že je to dáno typovou konverzí řetězce „ahoj“ na číslo. (viz http://www.php.net/…s.string.php#… )
Ten komentář měl být ke [4] Sodalite: nikoliv k [10]. To mi tam hodila funkce odpovědět a nevšiml jsem si toho.
Existuje ještě jedna možnost, hádejte
[4] Sodalite: jsem rád, že se ptáš. Snažím se, aby tyto hádanky měly určitý přesah, varování před zrádným místem PHP.
Při porovnávání čísla a řetětce postupuje PHP tak, že řetězec převede na číslo a pak obě čísla porovná.
'Ahoj'se převede na0a protože platí0==0, podmínka je splněna.Obdobně v případě true dochází k přetypování na boolean a
'Ahoj'se převede na true. Atrue==trueopět platí.Kromě porovnání
==naštěstí PHP zná i striktní===(resp.!==), které zrádné přetypování neprovádí.Závěr?
Dalo by se říct: kašlete na
==a používejte výhradně===. Jenže i tady je jeden háček, ale ten prozradím, jakmile přijdete na ono „čtvrté $value“Som vedel, ze to nebude take lahke :)
Tiez velmi dolezite pre programatorov zvyknutych z C/C++, NULL !== FALSE, na com som sa veru par krat nachytal…
zeby este null?
nieson si isty, nemam poruke php…
[9] hvge: výborně!
takže rekapitulace:
Pokud byste chtěli namítnout, že 0 a 0.0 je totéž, pak vězte, že
0 === 0.0neplatí! Což je asi jediná zrádnost skvělého operátoru===[7] Bohumír Bednařík (BoboCop): á, bug, hned ho jdu odvšivit.
jakýkoliv řetězec, neboť se jedná o numerické porovnání
[12] David Grudl: no mozna to nechapu, ale podle me je dobre je
0 ===0.0protoze matematicky 0 a 0.0 je to same, ale zabira to jinou velikost v pameni. nebo jinak: porovnavam totiz cele cislo s realnym, tedy hrusky s jabkami, tedy nemuze si to byt rovo i kdyzby se jabko podobalo hrusce sebevic.nebo se pletu?
Presne kvôli tomuto type casting magic na PHP nadávam, ale inak rvem === a !== všade kde sa len dá.
[14] wiki: Asi tak… Pokud už se má jednat o striktní porovnání, tak je vhodné, aby rozlišovalo i int a float (i když je to pro PHP nezvyklé…)
[14] wiki: je to naprosto v pořádu. Ale musíte to mít na paměti.
Jak už jsem psal, doporučuji si zvyknout na výhradní používání
=== a !==. Je však třeba pamatovat na to, že 0.0 !== 0 a neprobdít kvůli tomu zbytečně celou noc při hledání chybyVelmi zradny je aj nasledujuci kus kodu:
IF ocakava bool, preto PHP pred porovnanim „0“ najskor string pretypuje na bool, co v tomto jedinom pripade vrati false. Odchovanci C/C++ to maju hold v PHP tazke…
Zajímavá hádanka. Já jsem ještě přišel na to, že když dáme do
$valuei (neexistující) konstantu, tak to PHP pobere i když tam bude operátor===.Zajímavé, co PHP všechno pobere.
[19] halogan: Ano, ale kdybyste nadefinoval „ahoj“ jako konstantu a přiřadil jí jinou hodnotu, tak pak už ne.
[19] halogan: neexistující konstantu chápe PHP jako řetězec a vyhodí Notice. Dle mého je to zralé spíš na Error, přinejmenším Warning. Holt PHP si určitou benevolencí kazí pověst.
[20] Pavel Zbytovský: To mi je jasné, jen mi to přišlo zvláštní, že se takto PHP chová. Žádnou notice to bohužel nehodilo, asi nemám nastavené errory, díky za připomínku.
Druhá polovina reaguje na [21] David Grudl:, aby bylo jasno.
Nejrelevantnější link: http://www.php.net/…parisons.php
Také by někoho mohlo překvapit, že řetězec „0“ je empty.
Díky za vysvětlení. Takže si jdu všechny == změnit za ===, člověk nikdy neví.
můžete mi říct, kdy php-programátor používá reálná čísla? snad možná někdo pro ceny nebo tak něco, ale tady je asi lepší použít cena*100 a ukládat to jako integer
iXi: pro ankety, kurzy men, ceny (cena * 100 je neprijatelne), hodnoty pro vykreslovani grafu a tak dale.