Autor Zpráva
Tomasds
Profil
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
Tomasds
ano, toto je nesmysl, takle je to to samé:
if ($_GET['akce'] == "vypln")
tiso
Profil
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
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
je to pro případ nenastavené proměnné
Alphard
Profil
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
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
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
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
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
Tomasds
Na žádný takový jsem ještě nenarazil.
C/C++?
Timy
Profil
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
Timy
FALSE

if($var == "fgh")
    echo "TRUE";
else
    echo "FALSE";

jenom todle - vypíše ttaké FALSE

proč tedy dávat to isset?
Alphard
Profil
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
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
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
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
Alphard, Timy
Tak děkuji, od ted teda taky nebudu :D
nesro@jabber.org
Profil *
[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
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
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
Ten skript je příšerný :) v první konstrukci else if by se možná šiklo in_array() a pole hodnot.
DoubleThink
Profil *
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.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: