Částečné vyhodnocení podmínek v PHP

MyEgo.cz

home foto blogy mywindows.cz kontakt

Částečné vyhodnocení podmínek v PHP

PHP 24.04.08

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...


Komentáře

  1. 1 neni treba 24.04.08, 01:04:13
    FB

    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.

  2. 2 mpx 24.04.08, 01:04:20
    FB

    [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)

  3. 3 Jan Juříček 24.04.08, 04:04:26
    FB

    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?

  4. 4 Martin Demin 24.04.08, 09:04:05
    FB

    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ý).

  5. 5 Radek Hulán 24.04.08, 10:04:44
    FB

    [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...

  6. 6 Ondra Nekola 24.04.08, 11:04:58
    FB

    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 ;)

  7. 7 Radek Hulán 24.04.08, 12:04:03
    FB

    [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();

  8. 8 Arcao Bellini 24.04.08, 02:04:52
    FB

    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.