Érdekes PHP kód

1
2
3
4
5
6
7
8
<?php
$a = 'string';
$b = 0;
 
if ( $a == true && $b == false && $a == $b )
{
    echo ( 'universe broken' );
}

Mindenki tippelje meg, hogy fogjuk -e látni valaha a feliratot.

Update:
Én ugyan skype – on kaptam a de az egyik szemfüles kommentelő megtalálta az eredetijét a dolognak.
http://www.otton.org/2008/08/06/stupid-php-tricks-true-false-comparison/. Köszönet KisPocok.

8 HOZZÁSZÓLÁS

  1. Nem kötelező a lezárás ;)

    Amúgy ez a “hiba” onnan fakad, hogy a PHP típus nélküli változókat használ. Menet közben konvertálja a típusokat.

    kezdjük az elején:
    – $a == true
    Ez egyszerű:) Minden string ami nem nulla hosszúságú true.

    – $b == false
    Naggyon egyszerű :) A 0 numerikus érték a hamis az 1 igaz.

    – $a == $b
    Ezen kicsit gondolkodtam, de aztán rájöttem :)
    a $a stringet megpróbálja numerikus értékké konvertálni (azért nem a $b próbálja meg stringgé mert a numerikus értéket gyorsabban tudja összehasonlítani). A ‘1234’ stringet lazán át tudná konvertálni ezerkettőszázharmincnéggyé, de mivel a ‘string’ kifejezésben nincsenek numerikus karakterek, ezért a konvertálás után 0 lesz az értéke (olyan mint az intval).
    Tehát 0 == 0!

    gondolom a fenti kis kódot ez ihlette:
    http://uk.php.net/manual/hu/types.comparisons.php

    :)

  2. Nem kell lezárni a php tagot. Ezt a php megteszi automatikusan helyettünk, ha EOF jelet talál a fileban. Nagyobb projektnél kifejezetten előnyös, mert nem mennek el fél órák azzal, hogy vajon hol maradt egy szóköz a ?> jel után.

  3. Olvasom itt a hozzászólásokat és látom milyen magyarázatok születnek.
    A legegyszerűbb és szerintem legigazabb az hogy rossz a php kód. Logikai hiba.
    Mert amennyire tudom és ahogy én szoktam logikai kifejezéseket 3db egyenlőség jellel kell összehasonlítani, különben az nem jó eredményt ad.

    Azért ki is próbáltam és igazam van a helyes kód már ad hibás eredményt.
    if ( $a == true && $b == false && $a === $b )

    Remélem helyen gondolom :)

  4. de így csak azért nem teljesül a feltétel, mert a 3 = jel a típust is nézi, nem konvertál :)

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét