Na navigaci | Klávesové zkratky

Komentáře

  1. mone #1

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

    No?

    před 12 lety
  2. Bohumír Bednařík (BoboCop) http://www.bobocop.cz/blog/ #2

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

    • ‚ahoj‘ nebo „ahoj“
    • true
    • a nula
    před 12 lety
  3. hvge http://hvge.sk #3

    $value = "ahoj";
    $value = true;
    $value = 0;
    před 12 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 12 lety
  6. Bohumír Bednařík (BoboCop) http://www.bobocop.cz/blog/ #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 12 lety
  7. Bohumír Bednařík (BoboCop) http://www.bobocop.cz/blog/ #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 12 lety | reagoval [12] David Grudl
  8. David Grudl http://davidgrudl.com #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 12 lety
  9. hvge http://hvge.sk #9

    $value = 0.;

    Som vedel, ze to nebude take lahke :)

    před 12 lety | reagoval [12] David Grudl
  10. hvge http://hvge.sk #10

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

    před 12 lety
  11. ia #11

    avatar

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

    před 12 lety
  12. David Grudl http://davidgrudl.com #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 12 lety | reagoval [14] wiki
  13. Dan Péder #13

    avatar

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

    před 12 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 12 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 12 lety
  16. Jan Brašna http://www.janbrasna.com #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 12 lety
  17. David Grudl http://davidgrudl.com #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 12 lety
  18. hvge http://hvge.sk #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 12 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 12 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 12 lety | reagoval [22] halogan
  21. David Grudl http://davidgrudl.com #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 12 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 12 lety
  23. halogan #23

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

    před 12 lety
  24. llook http://llook.wz.cz/weblog/ #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 12 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 12 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 12 lety
  27. Your nightmare #27

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

    před 9 lety

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