Skrót do strony głównej: Alt + Shift + górny 2(@)
Linkedin FB e-mail Google Plus Twitter

Szukać na tej witrynie

 
 
Wersje językowe nie są identyczne – zobacz wszystkie wersje,
które rozumiesz.

Osobisty blog
Prywatny, niezawodowy mikroblog.
Artykuł nr 43

 


Pořadí argumentů okolo logického operátoru and.

Pořadí argumentů okolo logického operátoru and.

Poznámka pro začínající programátory nejen v PHP.


Je výraz "a and b" totéž jako výraz "b and a"?
Ano,
ve smyslu binární logiky, podle Booleovy algebry, v souladu s matematikou, znamenají oba výrazy totéž.

Je tedy jedno, jestli v PHP napíšete
"if ($a and $b)",
nebo
"if ($b and $a)"
?
Ne,
není to jedno.

Jakto?

Vezmu to trochu oklikou, pro názornost:
Když máme výraz "A and B"
(A a zároveň B; A × B)
a zjistíme, že A == false,
tak co z toho plyne?

Plyne z toho, že výsledek bude false.
Nezávisle na tom, jaká je hodnota proměnné B.

Ještě jednou: Nezávisle na tom, jaká je hodnota proměnné B!
Čili nás už v tu chvíli hodnota proměnné B nezajímá.

A úplně stejně uvažuje i engine, který vykonává skript napsaný v jazyce PHP.

Takže pořadí podmínek má při použití operátoru "and" naprosto fatální dopad:



1) Velmi typická situace:

if ( isset($a) and ($a>0) ) {}

Tento zápis je v naprostém pořádku.
Pokud proměnná $a není nastavena,
tak PHP ví, že výsledek závorky bude každopádně false,
proto se už dál nezabývá další podmínkou, tedy netestuje, zda je hodnota $a větší než nula, a vše je v pořádku.

Není potřeba používat zápis
if ( isset($a) ) if ( $a>0 ) {},
protože v praxi oba zápisy vyjdou úplně na stejno.


Zatímco kdybyste pořadí dílčích podmínek zaměnili,
tak by vždy nejdříve bylo zjišťováno, zda má proměnná $a hodnotu větší než nula.
A to i v případě, že proměnná $a vůbec není definována, vůbec neexistuje.
PHP pak v takovém případě hodí warning,
a věřte mi, že warningy nejsou od toho, aby se ignorovaly,
warningy jsou od toho, aby se řešily,
protože warning je potenciální budoucí chyba.

A stejně jako to je u validity HTML kódu (kde mnozí ignorují chyby, protože "to stejně funguje"),
i zde platí, že když si budete kód udržovat hezký, čistý, validní, korektní, uklizený,
tak si potom hned všimnete nějakého warningu, který na vás někdy vyskočí, a který tak může zabránit hypotetické závažné chybě v programu.

A i kdybyste chtěli psát kód plný warningů (nedoporučuji),
tak pořád platí, že isset napsaný až po operátoru and, když už se předtím testovala konkrétní hodnota, je úplně k ničemu.
Nemusíte už ověřovat, jestli nějaká proměnná vůbec existuje, když už jste stejně na férovku zjišťovali její hodnotu.


Takže na pořadí dílčích podmínek okolo operátoru and záleží.



2) Inkrementace (přičtení jedničky). I jiné akce:

PHP vám umožňuje přímo v podmínce měnit hodnotu proměnné.

(Takže bacha, abyste při porovnávání používali dvě rovnítka;
jak jedno vynecháte, tak hodnotu druhé proměnné přiřadíte té první,
a budete se strašně divit, co ten skript dělá.)

Nejde ale jen o rovnítko.

Přímo v porovnání můžete použít i zápis $a++,
případně také ++$a (což je fatální rozdíl právě při porovnávání proměnných).

Takže není jedno, zda tato podmínka bude posuzována, nebo nebude.
Když ji budete mít až za and,
a dílčí podmínka umístěná před and vrátí dílčí hodnotu false,
tak ta druhá podmínka nebude vůbec posuzována, čili to, co je v ní ukryto, se nevykoná,
a vy byste se mohli hodně divit.


Totéž platí i pro dekrementaci (odečtení jedničky)
"$a--", resp. "--$a".


A platí to i pro SQL dotazy
a pro spouštěné funkce (!)
a pro cokoliv dalšího,
co vám vrátí nějakou hodnotu (takže to třeba použijete v podmínce),
jenže cestou to něco dělá, něco mění (takže fakt není jedno, jestli to proběhne, nebo ne).




3) Optimalizace výkonu.

Pokud mám dvě dílčí hodnoty, jejichž pořadí není ovlivněno ani bodem 1 ani bodem 2 ad výše,
tak mne může zajímat pravděpodobnost, že v reálném provozu bude některá z těch dílčích podmínek obvykle vracet nějakou předvídatelnou hodnotu.


Např. pokud budu mít podmínku v cyklu "while" (nebo "do while"),

kde jedna z těch podmínek bude řídicí, provozní;
a druhá dílčí podmínka bude nouzová, záchranná, pro případ netypické situace, abychom se nezacyklili a korektně cyklus ukončili bez zbytečného zvyšování teploty v serverovně a stresování uživatelů,

tak naprosto dává smysl testovat nejdříve tu provozní, pak teprve použít "and", a pak teprve napsat tu jisticí podmínku.

Protože ta jisticí podmínka bude mít typicky hodnotu true (když se bavíme o modelu while( něco and něco) { něco dělej} ),
a tak je nevhodné ji uvádět jako první, když se po ní téměř vždy bude provádět i ta druhá.
Je lepší uvést jako první tu, která nám častěji hodí false, a tak způsobí, že se druhá dílčí podmínka už nebude testovat.
Pokud jedna z podminek je vetsinou false, tak ji dam jako prvni, a diky tomu ta druha obvykle neni zbytecne testovana.


Samozřejmě kromě situací ad bod 1 (isset) nebo ad bod 2 (výkon akce v podmínce), to je jasné.






Takže na pořadí okolo "and" v PHP záleží.


Jo, a toto všechno samozřejmě platí i pro operátor "or".
Jen naopak. Tam se další dílčí podmínka netestuje, pokud má ta předchozí hodnotu true.

Takže kdyby šlo třeba o optimalizaci výkonu, tak okolo logického operátoru "or" narovnám dílčí podmínky tak,
aby první byla ta, která má častěji hodnotu true, protože tím zařídí, že se počítač nebude muset zabývat tou druhou dílčí podmínkou.






Shrnutí a SEO keywords:
Podminka if
operator and or
na poradi zalezi
operator a zaroven
operator nebo
PHP

V praxi zalezi na poradi dilcich podminek,
i kdyz teoreticky matematicky na nem zalezet nema.


Ono to vlastně tématicky trošku souvisí s Karnaughovou mapou:
Tam také vidíme, že na základě nějaké hodnoty nějaké vstupní proměnné si můžeme dovolit nezkoumat hodnotu některé jiné proměnné, protože jistě víme, že už nás v tu chvíli vlastně nezajímá. Tak to samé ví i PHP engine.

Můžete si to snadno vyzkoušet:

<?php

$i=0;

if (0 and $i++>0) echo '';

echo $i.'<br />';

if ($i++>0 and 0) echo '';

echo $i.'<br />';

?>

 

Związane linki

  


Czy się artykuł Państwu podobał?


Informacja zwrotna – głosowanie

Hlasy se na serveru připočítají k počitadlům pro tento článek, např. kolikrát tento článek někoho pobavil a kolikrát tento článek někomu pomohl.

Neukládají se jednotlivá hlasování (vzájemná kombinace hlasů, datum, čas, ani jiné údaje).
Proto nemá smysl odesílat prázdný hlas, nemělo by se co k čemu přičíst.

 

Ve Vašem prohlížeči nebude uložena žádná informace (cookies) o tom, že už jste hlasovali.
- Ve Vašem prohlížeči tedy nebude vidět, jak jste hlasovali.
- Kdykoliv budete moci hlasovat znovu, pokud Vám článek opakovaně pomůže (pobaví Vás, potěší, …).
- Pokud Vás právě u jednoho počítače sedí více, mohou postupně hlasovat další lidé.

Počítám člověkohlasy, nikoliv lidi.
Tedy kolikrát článek někomu pomohl,
nikoliv kolika lidem pomohl
.

Třikrát potěšeného jednoho čtenáře počítám stejně jako tři různé jednou potěšené čtenáře.

Každý má do budoucna neomezený počet hlasů.
Když zapomenete, že jste pro tento článek už hlasovali, nevadí – když Vám někdy v budoucnu bude např. užitečný znovu, tak mu znovu pošlete hlas, že Vám byl užitečný.

Można wybrać sobie 1 do N opcji

Štítky, labels, kategorie, témata, tagy, hashtagy

(ve vývoji)
 
#science-technology   #electro-ict    
#languages  
 

Skok w górę do: Menu nawigacyjne
(skrót klawiatury Alt + Shift + „5”)

Zainteresowani tą stroną?

  • Add to bookmarks (Ctrl+D)
  • Udostępnić link (CB radio)Skok w górę do:
  • Wydrukować (Ctrl+P)
  • Cytować według ISO 690

    Tę stronę

    ADÁMEK, Martin. Osobisty blog: Prywatny, niezawodowy mikroblog.. Martin Adámek [online]. Náchod / Meziměstí (Republika Czeska) [dostęp 2023-02-02]. Dostępny w Internecie: https://www.adamek.cz/pl/blog

    Całą witrynę

    ADÁMEK, Martin. Martin Adámek [online]. Náchod / Meziměstí (Republika Czeska) [dostęp 2023-02-02]. Dostępny w Internecie: https://www.adamek.cz/pl

 

 
 

Narodowe kulturowe dziedzictwo

WebArchiv – Ta witryna jest archiwowana przez Bibliotekę Narodową Republiki Czeskiej Ta witryna jest regularnie archiwowana przez Bibliotekę Narodową Republiki Czeskiej z powodu jej kulturowej, edukacyjnej, naukowej, badawczej lub innej wartości informacyjnej w celu dokumentacji autentycznej próbki czeskiej przestrzeni www. Witryna ta jest częścią kolekcji czeskich witryn webowych, które ma Biblioteka Narodowa Republiki Czeskiej zamiar długoterminowo przechowywać i udostępniać dla przyszłych pokoleń. Ich zapis jest częścią Czeskiej narodowej bibliografii oraz katalogu Biblioteki Narodowej Republiki Czeskiej.  

 

 
 

Na wesoło

Teoria - to kiedy wiecie wszystko, lecz nic nie pracuje.
Praktyka - to kiedy wszystko pracuje, lecz nikt nie wie dlaczego.
Programowanie łączy teorię i praktykę - nic nie pracuje i nikt nie wie dlaczego.

 

Aforyzmy

Let him who would move the world first move himself.
[Socrates]