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í';
Na navigaci | Klávesové zkratky
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
mone #1
No?
Bohumír Bednařík (BoboCop) #2
Rovněž jsem na jiné řešení nepřišel. Tedy hodnoty:
hvge #3
Sodalite #4
A proč ta nula? Jsem Prostě Hloupý Programátor a tohle nevím.
wiki #5
hadam: nula je to proto ze (int)„ahoj“ == 0 == „ahoj“
jinak trojitej rovnase je lepsi na toto ;)
Bohumír Bednařík (BoboCop) #6
Bohumír Bednařík (BoboCop) #7
Ten komentář měl být ke #4 Sodalite nikoliv k [smazáno]. To mi tam hodila funkce odpovědět a nevšiml jsem si toho.
David Grudl #8
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 na0
a 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==true
opě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“hvge #9
Som vedel, ze to nebude take lahke :)
hvge #10
Tiez velmi dolezite pre programatorov zvyknutych z C/C++, null !== false, na com som sa veru par krat nachytal…
ia #11
zeby este null?
nieson si isty, nemam poruke php…
David Grudl #12
#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.0
neplatí! Což je asi jediná zrádnost skvělého operátoru===
#7 Bohumíre Bednaříku (BoboCop), á, bug, hned ho jdu odvšivit.
Dan Péder #13
jakýkoliv řetězec, neboť se jedná o numerické porovnání
wiki #14
#12 Davide Grudle, no mozna to nechapu, ale podle me je dobre je
0 ===0.0
protoze 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?
johno #15
Presne kvôli tomuto type casting magic na PHP nadávam, ale inak rvem === a !== všade kde sa len dá.
Jan Brašna #16
#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é…)
David Grudl #17
#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í chyby 🙂hvge #18
Velmi 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…
halogan #19
Zajímavá hádanka. Já jsem ještě přišel na to, že když dáme do
$value
i (neexistující) konstantu, tak to PHP pobere i když tam bude operátor===
.Zajímavé, co PHP všechno pobere.
Pavel Zbytovský #20
#19 halogane, Ano, ale kdybyste nadefinoval „ahoj“ jako konstantu a přiřadil jí jinou hodnotu, tak pak už ne.
David Grudl #21
#19 halogane, 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.
halogan #22
#20 Pavle 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.
halogan #23
Druhá polovina reaguje na #21 David Grudl, aby bylo jasno.
llook #24
Nejrelevantnější link: http://www.php.net/…parisons.php
Také by někoho mohlo překvapit, že řetězec „0“ je empty.
Sodalite #25
Díky za vysvětlení. Takže si jdu všechny == změnit za ===, člověk nikdy neví.
iXi #26
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
Your nightmare #27
iXi: pro ankety, kurzy men, ceny (cena * 100 je neprijatelne), hodnoty pro vykreslovani grafu a tak dale.
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.