Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akce až 50 % zdarma při nákupu e-learningu. Více informací:
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Kit
Tvůrce
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
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
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Luboš Běhounek Satik:9.7.2013 19:42

PHP :)

Nahoru Odpovědět
9.7.2013 19:42
https://www.facebook.com/peasantsandcastles/
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Kit
Tvůrce
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
Tvůrce
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Kit
Tvůrce
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Kit
Tvůrce
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Kit
Tvůrce
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.