Diskuze: 0 == "řetězec"

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

Aktivity (1)
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:9.7.2013 19:31

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:9.7.2013 19:35

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:9.7.2013 19:37

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:9.7.2013 19:38

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):9.7.2013 19:39

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:9.7.2013 19:41

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
Luboš Běhounek (Satik):9.7.2013 19:42

PHP :)

Nahoru Odpovědět 9.7.2013 19:42
:)
Avatar
archlin
Člen
Avatar
archlin:9.7.2013 19:42

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:9.7.2013 19:43

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:9.7.2013 19:46

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:9.7.2013 19:47

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:9.7.2013 19:48

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:9.7.2013 19:48

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:9.7.2013 19:49

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:9.7.2013 19:53

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:9.7.2013 19:58

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:9.7.2013 19:59

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:9.7.2013 20:02

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:9.7.2013 20:03

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:9.7.2013 20:05

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:9.7.2013 20:17

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.