Částečné vyhodnocení podmínek v PHP
Pokud vás zajímá, zda se PHP chová inteligentně u vyhodnocování podmínek, které mají předem jasný výsledek (jako TRUE or PODMINKA), tak odpověď je ano. Ta část podmínky, kterou není potřeba vyhodnocovat, není vůbec provedena.
Tento kód:
<?php function T(){ echo '- T<br>'; return 1; } function F(){ echo '- F<br>'; return 0; } echo 'T || F<br>'; if (T() || F()) ; echo '<br>T or F<br>'; T() or F() ; echo '<br>F && T<br>'; if (F() && T()) ; echo '<br>F and T<br>'; F() and T() ; ?>
Vypíše toto:
T || F - T T or F - T F && T - F F and T - F
Proč vlastně tuto jasnou věc zkoumat? V PHP si člověk není jistý ničím, a to ani od verze k verzi, je potřeba to neustále ověřovat, včetně takto triviálních věcí. C++ je jiná káva...
Dobrý den,
tuto vlastnost ale doufam neberete jako nějakou skvělou feature PHP. Takovéto vyhodnocování podmínek mají implementovány _snad_ všechny dnes používané jazyky. Kdyby to tak nebylo, tak bych to bral jako opravdu velkou stupiditu.
[1] Tohle je zřejmě převzaté z C++, kde je to i definováno ve standardu - podmínky se vyhodnocují zleva doprava a jakmile je znám výsledek, vyhodnocování končí. Často se toho využívá v konstrukcích typu:
if (x!=NULL && x->something=valid) {
x->do_something();
}
Ale jsou i jazyky které to mají opačně, tuším v Pascalu je vyhodnocování zprava doleva (a to jestli se výraz vyhodnocuje celý nebo ne závisí už jen na kompilátoru)
Mám pocit, že by ještě měla být uvedena varianta
echo '<br>T && F<br>'; if (T() && F()) ;
echo '<br>T and F<br>'; T() and F() ;
Poté by bylo zřejmé ne jen to, že PHP dělá, to co se od nějak očekává, ale že od lidí, kteří v PHP píší své skripty, se též očekává přemýšlení ohledně uspořádání podmínek.
Problém je, že ti, kterým by ta informace mohla pomoci, jí pravděpodobně nezachytí nebo nepochopí a ti, kteří ji pochopí, ti pořadí operátorů nejspíše zohledňují ve svých úvahách automaticky a tedy je jim (ta informace) zcela k ničemu.
Vejce, nebo slepice?
Toto sa tiež nazýva aj skratové(short-circuit) alebo minimálne vyhodnocovanie a používa ho snáď každý modernejší jazyk(skriptovací alebo kompilovaný).
[1] v PHP si člověk není jistý ničím, a to ani od verze k verzi, je potřeba to neustále ověřovat, i takto triviální věci. C++ je jiná káva...
Pozor na typické neporozumnění filosofii programovacích jazyků. Hlavním cílem zkráceného vyhodnocování není něco zrychlovat, jde jenom o další, byť na první pohled maskovanou, formu řízení běhu, jak je pěkně vidět z příkladu [2]. Nejroztomilejší příklad je oblíbené "perlovské" condition OR die ;)
[6] to je zřejmé asi všem, přesto není u interpretovaných jazyků ve všech verzích toto chování pravidlem.
Typické použití v PHP, validace oprávnění uživatele / admina / zákaz postupu ve funkci:
$member->teamRights() or $member->isAdmin() or disallow();
Já teda nevím, ale tohle funguje stejně jako v C, C++ a dalších jazycích podobných syntaxi Cčka.
V tvém případě je tedy spravným řešení použití bitových operátorů:
echo 'T | F<br />'; echo (T() | F()).'<br />';
echo 'T & F<br />'; echo (T() & F()).'<br />';
Stejně to funguje i v Cčku.