Na navigaci | Klávesové zkratky

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

  1. mone #1

    • „ahoj“
    • true
    • 0 (nula), libovolný počet

    No?

    před 19 lety
  2. Bohumír Bednařík (BoboCop) #2

    Rovněž jsem na jiné řešení nepřišel. Tedy hodnoty:

    • ‚ahoj‘ nebo „ahoj“
    • true
    • a nula
    před 19 lety
  3. hvge #3

    $value = "ahoj";
    $value = true;
    $value = 0;
    před 19 lety
  4. Sodalite #4

    avatar

    A proč ta nula? Jsem Prostě Hloupý Programátor a tohle nevím.

  5. wiki #5

    hadam: nula je to proto ze (int)„ahoj“ == 0 == „ahoj“

    jinak trojitej rovnase je lepsi na toto ;)

    před 19 lety
  6. Bohumír Bednařík (BoboCop) #6

    [smazáno] řekl bych, že je to dáno typovou konverzí řetězce „ahoj“ na číslo. (viz http://www.php.net/…s.string.php#… )

    před 19 lety
  7. 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.

    před 19 lety | reagoval [12] David Grudl
  8. David Grudl #8

    avatar

    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 na 0 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. A true==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“

    před 19 lety
  9. hvge #9

    $value = 0.;

    Som vedel, ze to nebude take lahke :)

    před 19 lety | reagoval [12] David Grudl
  10. hvge #10

    Tiez velmi dolezite pre programatorov zvyknutych z C/C++, null !== false, na com som sa veru par krat nachytal…

    před 19 lety
  11. ia #11

    avatar

    zeby este null?
    nieson si isty, nemam poruke php…

    před 19 lety
  12. David Grudl #12

    avatar

    #9 hvge, výborně! 🙂

    takže rekapitulace:

    $value = "ahoj";
    $value = true;
    $value = 0;
    $value = 0.0;

    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.

    před 19 lety | reagoval [14] wiki
  13. Dan Péder #13

    avatar

    jakýkoliv řetězec, neboť se jedná o numerické porovnání

    před 19 lety
  14. 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?

    před 19 lety | reagoval [16] Jan Brašna [17] David Grudl
  15. johno #15

    avatar

    Presne kvôli tomuto type casting magic na PHP nadávam, ale inak rvem === a !== všade kde sa len dá.

    před 19 lety
  16. 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é…)

    před 19 lety
  17. David Grudl #17

    avatar

    #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 🙂

    před 19 lety
  18. hvge #18

    Velmi zradny je aj nasledujuci kus kodu:

    $var = "0";
    if($var) {
    	echo "is some string...";
    }

    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…

    před 19 lety
  19. 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.

    $value = ahoj;
    if ($value === "ahoj") echo "rovnost platí";
    před 19 lety | reagoval [20] Pavel Zbytovský [21] David Grudl
  20. Pavel Zbytovský #20

    avatar

    #19 halogane, Ano, ale kdybyste nadefinoval „ahoj“ jako konstantu a přiřadil jí jinou hodnotu, tak pak už ne.

    před 19 lety | reagoval [22] halogan
  21. David Grudl #21

    avatar

    #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.

    před 19 lety | reagoval [23] halogan
  22. 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.

    před 19 lety
  23. halogan #23

    Druhá polovina reaguje na #21 David Grudl, aby bylo jasno.

    před 19 lety
  24. llook #24

    avatar

    Nejrelevantnější link: http://www.php.net/…parisons.php
    Také by někoho mohlo překvapit, že řetězec „0“ je empty.

    před 19 lety
  25. Sodalite #25

    avatar

    Díky za vysvětlení. Takže si jdu všechny == změnit za ===, člověk nikdy neví.

    před 19 lety
  26. 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

    před 19 lety
  27. Your nightmare #27

    iXi: pro ankety, kurzy men, ceny (cena * 100 je neprijatelne), hodnoty pro vykreslovani grafu a tak dale.

    před 17 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.