Autor | Zpráva | ||
---|---|---|---|
Tomasds Profil |
#1 · Zasláno: 14. 1. 2009, 17:29:50
Docela často tady vídám takto napsaný if:
if (isset ($_GET['akce']) && $_GET['akce'] == "vypln") A otázka zní: má to smysl? Už jsem programoval v lecčem, ale všude platilo, že v této situaci se vždy vyhodnotí obě podmínky, provede se logický součin a podle výsledku se běh větví. Pokud je to tak i v php, což předpokládám, zdá se mi to prostě napsané špatně, protože není možné, aby platila ta druhá a zároveň nebyla splněna ta první. Pokud by byl důvod vyhodnocovat obsah $_GET['akce'] až potom, co zjistím že platí isset ($_GET['akce'], musí jít o dva vnořené ify, nikoliv jeden. Sem ale podobnou konstrukci už napsalo tolik lidí, že tomu nerozumím. |
||
SwimX Profil |
#2 · Zasláno: 14. 1. 2009, 17:36:32
Tomasds
ano, toto je nesmysl, takle je to to samé: if ($_GET['akce'] == "vypln") |
||
tiso Profil |
#3 · Zasláno: 14. 1. 2009, 17:37:24 · Upravil/a: tiso
SwimX - nie je!
Tomasds - problém je inde - premenná nemusí existovať, a teda by si testoval neexistujúcu premennú. Generuje to chybu s levelom E_NOTICE. Je slušným zvykom pri programovaní pracovať s existujúcimi (inicializovanými) premennými. |
||
SwimX Profil |
#4 · Zasláno: 14. 1. 2009, 17:39:16
tiso
„premenná nemusí existovať, a teda by si testoval neexistujúcu premennú“ pokud nebude existovat, pak se určitě nerovná vypln, nebo ne? takže podmínka nesplněna, de se dál |
||
Alphard Profil |
#5 · Zasláno: 14. 1. 2009, 17:40:32
je to pro případ nenastavené proměnné
|
||
Alphard Profil |
#6 · Zasláno: 14. 1. 2009, 17:42:46
pozdě
SwimX „pokud nebude existovat, pak se určitě nerovná vypln,“ to je pravda, ale jak psal tiso, bude se generovat E_NOTICE, spoustu lidí to nešte a potlačí to, ale mělo by se pracovat s inicializovanými proměnnými |
||
Tomasds Profil |
#7 · Zasláno: 14. 1. 2009, 17:43:15
tiso, Alphard
O tom píšu v předposledním řádku. Php funguje tak, že vyhodnotí jednu podmínku a když není splněna, druhou ignoruje?? |
||
Alphard Profil |
#8 · Zasláno: 14. 1. 2009, 17:46:40
Tomasds
„Php funguje tak, že vyhodnotí jednu podmínku a když není splněna, druhou ignoruje“ pokud není třeba vyhodnocovat druhou, tak ji ignoruje a || b – a je true, na b se vykašle a || b – a je false, b vyhodnotí a && b – a je false, na b kašle |
||
SwimX Profil |
#9 · Zasláno: 14. 1. 2009, 17:49:22
Tomasds
„Php funguje tak, že vyhodnotí jednu podmínku a když není splněna, druhou ignoruje?“ to dělá většina programovacích jazyků Alphard, tiso „je to pro případ nenastavené proměnné“ co by se tedy stalo při: if ($_GET['akce'] == "vypln") kdyby nebyla nastavena? „Generuje to chybu s levelom E_NOTICE.“ a spadne script? |
||
Tomasds Profil |
#10 · Zasláno: 14. 1. 2009, 17:54:43
SwimX
to dělá většina programovacích jazyků Na žádný takový jsem ještě nenarazil. Alphard pokud není třeba vyhodnocovat druhou, tak ji ignoruje Ano, tak jsem to myslel. Připadá mi to docela zvláštní, ale asi je to efektivní. Díky |
||
SwimX Profil |
#11 · Zasláno: 14. 1. 2009, 17:56:23
Tomasds
„Na žádný takový jsem ještě nenarazil.“ C/C++? |
||
Timy Profil |
#12 · Zasláno: 14. 1. 2009, 17:56:37
Tomasds
„Už jsem programoval v lecčem, ale všude platilo, že v této situaci se vždy vyhodnotí obě podmínky, provede se logický součin a podle výsledku se běh větví.“ Který jazyk to tak dělá? Zatím jsem se nesetkal s jazykem, který by logické operátory nevyhodnocoval líně. Samozřejmě, že to PHP vyhodnocuje líně a když je první výraz FALSE, další už nevyhodnotí. function nesmysl() { echo "nesmysl"; return true; } $var = ""; if(isset($var) && nesmysl()) echo "TRUE"; else echo "FALSE"; Vyzkoušej, co to vypíše, když smažeš sedmý řádek. |
||
SwimX Profil |
#13 · Zasláno: 14. 1. 2009, 18:06:15 · Upravil/a: SwimX
Timy
FALSE if($var == "fgh") echo "TRUE"; else echo "FALSE"; jenom todle - vypíše ttaké FALSE proč tedy dávat to isset? |
||
Alphard Profil |
#14 · Zasláno: 14. 1. 2009, 18:08:03
„a spadne script?“
ne, nespadne, PHP je velice benevolentní SwimX Timy ví, co to vypíše, podstatné je, že to nevypíše "nesmysl" |
||
SwimX Profil |
#15 · Zasláno: 14. 1. 2009, 18:10:36
Alphard
„ne, nespadne, PHP je velice benevolentní“ pak tedy if (isset ($_GET['akce']) && $_GET['akce'] == "vypln") můžu napsat jako if ($_GET['akce'] == "vypln") |
||
Timy Profil |
#16 · Zasláno: 14. 1. 2009, 18:11:22
SwimX
„proč tedy dávat to isset?“ Protože nejsem prase, abych pracoval s proměnnou, která možná neexistuje. Navíc to může generovat warningy a vzhledem k tomu, že nastavení serveru ne vždy můžu ovlivnit, tak si to radši vždycky zkontroluji. |
||
Alphard Profil |
#17 · Zasláno: 14. 1. 2009, 18:13:10
Timy
čteš mi myšlenky, slovo prase jsem měl již napsané, pak jsem ho smazal :-) SwimX ptal ses mě, tak ti odpovím, taky nejsem prase |
||
SwimX Profil |
#18 · Zasláno: 14. 1. 2009, 18:15:22
Alphard, Timy
Tak děkuji, od ted teda taky nebudu :D |
||
nesro@jabber.org Profil * |
#19 · Zasláno: 14. 1. 2009, 18:19:09
[pre]if (isset ($_GET['akce']) && $_GET['akce'] == "vypln")[/pre]
neprve zkusí isset, pokud je nastavena promněná, tak pokračuje dál testováním zdali se proměná rovná něčemu, je to nejsprávnější zápis, protože se [b]nepracuje[/b] s neinicializovanou proměnou! to je jako: -máš ten rohlík namazanej máslem? -ale já nemam rohlík!? není lepší: -máš rohlík? -ne a pokud ano tak: -a je nemazanej máslem? -bohužel |
||
SwimX Profil |
#20 · Zasláno: 14. 1. 2009, 18:22:16
nesro@jabber.org
pochopil jsem to. I bez rohlíku :) a myslím že většina lidí také. eště se ospravedlním: zjistil jsem, že taky nejsem prase: :D if(!isset($_GET['s']) || $_GET['s'] == "uvod" ) include "uvod.txt"; else if($_GET['s'] == "fotky" || $_GET['s'] == "reference" || $_GET['s'] == "kontakt" || $_GET['s'] == "stahuj" || $_GET['s'] == "diskuse") include "{$_GET['s']}.txt"; else include "chyba.txt"; |
||
Tomasds Profil |
#21 · Zasláno: 14. 1. 2009, 18:27:28
SwimX
nedělal jsem v C. V čem, to je jedno, už je to dost dávno. Pro mě už je vyřešeno a nezdá se mi, že by tady mohlo přibýt něco užitečného, zamykám. |
||
Měsíček Profil |
#22 · Zasláno: 14. 1. 2009, 18:27:44
Ten skript je příšerný :) v první konstrukci else if by se možná šiklo in_array() a pole hodnot.
|
||
DoubleThink Profil * |
#23 · Zasláno: 14. 1. 2009, 21:11:47
„Protože nejsem prase, abych pracoval s proměnnou, která možná neexistuje.“
Nebyl bych zase tak ortodoxní. To, že PHP vyhazuje notices u porovnávacích operátorů, považuji za kreténismus. Struktura $neexistujici_promenna != 'ahoj' nemůže způsobit žádný ani hypotetický problém. Mohla by způsobit problém třeba v céčku, protože by systém nevěděl, na kterou adresu v paměti se má podívat (nebo by se dobýval na nějakou defaultní adresu, která mu nepatří), ale na tohle si PHP přece nehraje. „Navíc to může generovat warningy“ To nemůže. nastavení serveru ne vždy můžu ovlivnit Nesetkal jsem se s hostingem, kde by nefungovala fce error_reporting(). A notabene, kde by se defaultně zobrazovaly notices. |
||
Časová prodleva: 15 let
|
0