Diskuze: 0 == "řetězec"

PHP PHP 0 == "řetězec" American English version English version

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Dnes jsem narazil na další zajímavý bug v PHP, vypadá to, že porovnání nuly s kterýmkoli řetězcem vrátí true! To může být v určitých případech poměrně nebezpečné. Vidí v tom někdo nějaký smysl nebo jsou to blbci?

Odpovědět 9.7.2013 19:31
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
archlin
Člen
Avatar
archlin:

a porovnávaš to == alebo === ?

Nahoru Odpovědět 9.7.2013 19:35
sublime text 2
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na archlin
David Čápka:

Porovnávám to samozřejmě ==.

Nahoru Odpovědět 9.7.2013 19:37
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

A co se píše v manuálu? Že máš používat "===".

Nahoru Odpovědět  +2 9.7.2013 19:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Michal Žůrek (misaz):

Bug to není: https://bugs.php.net/bug.php?… píší to tam asi v druhém příspěvku

Nahoru Odpovědět 9.7.2013 19:39
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Je mi celkem jedno co se píše v manuálu, ptal jsem se na důvod.

Nahoru Odpovědět 9.7.2013 19:41
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
archlin
Člen
Avatar
archlin:

ak pretypuješ string na int tak je to 0 preto platí podmienka.
if (0 == "nieco") podmienka splnená
if (0 == "0") podmienka splnená

Nahoru Odpovědět 9.7.2013 19:42
sublime text 2
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na archlin
David Čápka:

Ano, to jsem pochopil, ale já se ptám proč tomu tak je, ne jestli to tak je. Pokud je string neprázdný, mělo by to přeci vrátit 1.

Nahoru Odpovědět 9.7.2013 19:43
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Dúvodem je dynamické přetypování int-string. Myslím si, že už to udělalo víc problémů než užitku. Kdyby PHP nemělo tuhle vlastnost, možná by na spojování stringů bylo místo tečky plus.

Nahoru Odpovědět 9.7.2013 19:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
archlin
Člen
Avatar
archlin:

myslím že preto lebo sa ten reťazec nedá previesť na číslo ale neviem to s istotou.

Nahoru Odpovědět 9.7.2013 19:47
sublime text 2
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Proč zrovna "1"? Snažíš se převést string na int. Žádné číslo ve stringu nebylo nalezeno, tak se vrátí "0".

Myslím si, že TryParse v C# to dělá podobně.

Editováno 9.7.2013 19:50
Nahoru Odpovědět 9.7.2013 19:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na archlin
David Čápka:

On se převést dá, jinak by to hodilo error, ale vrátí nulu, což mi nedává smysl, když nula je v jejich typování false a string převedený na boolean vrací true. To je ostrý rozpor dvou hodnot a stále mě nenapadá konkrétní případ proč tohle udělali.

Nahoru Odpovědět 9.7.2013 19:48
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Protože když převedeš string na boolean, tak ti dá true a přitom tam žádný boolean taky není :)

Nahoru Odpovědět 9.7.2013 19:49
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Jenže ten string se nepřevádí na boolean, ale na int.

"123ahoj" + 2 = 125
"0ahoj" + 2 = 2
"ahoj" + 2 = 2
"" + 2 = 2
Nahoru Odpovědět 9.7.2013 19:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
archlin
Člen
Avatar
Odpovídá na David Čápka
archlin:

ono to zmysel dáva :
string 'aaaa' nemožno previesť na číslo tak to má 0
string '1000' je možné previesť na číslo konkrétne 1000
čo sa týka boolean tak tam sa iba kontroluje či to ma nejakú hodnotu

Nahoru Odpovědět 9.7.2013 19:58
sublime text 2
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Ano, samozřejmě, že se převádí na int. Jenže mě přijde tohle nelogické:

"ahoj" // true
"ahoj" // 0 = false

Logičtější mi přijde udělat ze stringu jedničku když v něm něco je.

Nahoru Odpovědět 9.7.2013 19:59
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Problém že nerozeznám "Ahoj" od "1" mi nepřijde horší než že nerozeznám "Ahoj" od 0, protože tam dochází ke změně boolean hodnoty. IMHO je to špatně navržené.

Nahoru Odpovědět 9.7.2013 20:02
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Když uděláš

if ("ahoj")

tak převádíš string na boolean. Výsledek je true.
Když uděláš

if (0 == "ahoj")

tak převádíš string na integer, aby se mohl porovnat s druhým integerem. Výsledek opět bude true
Když uděláš

if ("0")

tak výsledek bude false.

Je vidět, že nepíšeš testy.

Editováno 9.7.2013 20:04
Nahoru Odpovědět 9.7.2013 20:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Již jsem několikrát psal že vím proč to tak funguje. Můžeš mi vysvětlit v čem by byl problém kdyby "Ahoj" vrátilo 1?

Nahoru Odpovědět 9.7.2013 20:05
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Proč by mělo vracet "1". Když potřebuješ true, tak vrátí true.

if ("ahoj" == true)
   echo "podmínka splněna";
if ("ahoj" == 1)
   echo "sem se to nedostane";

Je logické, že 1 není true. Možná někde v céčku, protože céčko nezná boolean.

Nahoru Odpovědět 9.7.2013 20:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 21 zpráv z 21.