Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

porucha není na vašem přijímači

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í';

Karma body: 20. Líbil se vám článek?

Komentáře » přidat

  1. [1] mone: nový
    • „ahoj“
    • true
    • 0 (nula), libovolný počet

    No?

    Posláno 18. 5. 2005 ve 14.07 | Odpovědět
  2. [2] Bohumír Bednařík (BoboCop): nový

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

    • ‚ahoj‘ nebo „ahoj“
    • true
    • a nula
    Posláno 18. 5. 2005 ve 14.11 | Odpovědět
  3. [3] hvge: nový

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

    Posláno 18. 5. 2005 ve 14.11 | Odpovědět
  4. avatar [4] Sodalite: nový

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

    Posláno 18. 5. 2005 ve 14.16 | Odpovědět
    Na komentář reagoval [7] Bohumír Bednařík (BoboCop)
    Na komentář reagoval [8] David Grudl
  5. [5] wiki: nový

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

    jinak trojitej rovnase je lepsi na toto ;)

    Posláno 18. 5. 2005 ve 14.26 | Odpovědět
  6. [6] Bohumír Bednařík (BoboCop): nový

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

    Posláno 18. 5. 2005 ve 14.33 | Odpovědět
  7. [7] Bohumír Bednařík (BoboCop): nový

    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.

    Posláno 18. 5. 2005 ve 14.39 | Odpovědět
    Na komentář reagoval [12] David Grudl
  8. avatar [8] David Grudl: nový

    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“

    Posláno 18. 5. 2005 ve 14.53 | Odpovědět
  9. [9] hvge: nový
    $value = 0.;

    Som vedel, ze to nebude take lahke :)

    Posláno 18. 5. 2005 v 15.06 | Odpovědět
    Na komentář reagoval [12] David Grudl
  10. [10] hvge: nový

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

    Posláno 18. 5. 2005 v 15.12 | Odpovědět
  11. avatar [11] ia: nový

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

    Posláno 18. 5. 2005 v 15.18 | Odpovědět
  12. avatar [12] David Grudl: nový

    [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ír Bednařík (BoboCop): á, bug, hned ho jdu odvšivit.

    Posláno 18. 5. 2005 v 15.27 | Odpovědět
    Na komentář reagoval [14] wiki
  13. avatar [13] Dan Péder: nový

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

    Posláno 18. 5. 2005 v 15.41 | Odpovědět
  14. [14] wiki: nový

    [12] David Grudl: 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?

    Posláno 18. 5. 2005 v 15.42 | Odpovědět
    Na komentář reagoval [16] Jan Brašna
    Na komentář reagoval [17] David Grudl
  15. avatar [15] johno: nový

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

    Posláno 18. 5. 2005 v 16.40 | Odpovědět
  16. [16] Jan Brašna: nový

    [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é…)

    Posláno 18. 5. 2005 v 16.40 | Odpovědět
  17. avatar [17] David Grudl: nový

    [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 :-)

    Posláno 18. 5. 2005 v 16.52 | Odpovědět
  18. [18] hvge: nový

    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…

    Posláno 18. 5. 2005 v 18.02 | Odpovědět
  19. [19] halogan: nový

    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í";
    Posláno 18. 5. 2005 v 18.22 | Odpovědět
    Na komentář reagoval [20] Pavel Zbytovský
    Na komentář reagoval [21] David Grudl
  20. avatar [20] Pavel Zbytovský: nový

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

    Posláno 18. 5. 2005 v 18.55 | Odpovědět
    Na komentář reagoval [22] halogan
  21. avatar [21] David Grudl: nový

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

    Posláno 18. 5. 2005 v 19.12 | Odpovědět
    Na komentář reagoval [23] halogan
  22. [22] halogan: nový

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

    Posláno 18. 5. 2005 ve 20.32 | Odpovědět
  23. [23] halogan: nový

    Druhá polovina reaguje na [21] David Grudl:, aby bylo jasno.

    Posláno 18. 5. 2005 ve 20.32 | Odpovědět
  24. avatar [24] llook: nový

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

    Posláno 18. 5. 2005 ve 22.53 | Odpovědět
  25. avatar [25] Sodalite: nový

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

    Posláno 19. 5. 2005 v 1.57 | Odpovědět
  26. [26] iXi: nový

    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

    Posláno 19. 5. 2005 ve 22.12 | Odpovědět
  27. [27] Your nightmare: nový

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

    Posláno 30. 8. 2007 v 19.12 | Odpovědět

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

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

La Trine © 2004, 2008 David Grudl – o webu
provozuje Pachollini.

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

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