Script wordt niet goed uitgevoerd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Thomas van den Heuvel

Thomas van den Heuvel

06/09/2019 13:20:43
Quote Anchor link
Willem vp op 06/09/2019 01:04:31:
AND en OR zijn eigenlijk meer geschikt om iets flow control-achtigs mee te doen:
...
AND en OR zijn dus niet zozeer operators die je moet vermijden; het is meer een kwestie van weten waar ze geschikt voor zijn en ze in de juiste situatie toepassen.

Precies, en in bovenstaande code van de topicstarter -de PHP delen- betreft het in alle gevallen predikaten met condities die alle moeten gelden. In geen enkel geval gaat het om situaties waarbij het resultaat van een uit te voeren operatie dient uit te monden in het uitvoeren van een andere operatie / deel van een statement. Het gaat hier niet om flow control.

Willem vp op 06/09/2019 01:04:31:
Zou je dit met een || doen, dan gebeurt er iets heel anders. '||' heeft namelijk een hogere precedentie dan '=', dus eerst wordt "fopen() || show_error()" uitgevoerd, en het resultaat daarvan wordt toegekend aan $fh. Het is dan afhankelijk van de return value van show_error() wat er misgaat in je code.

Om misverstanden te voorkomen lijkt het mij sowieso altijd beter om expliciet haken te gebruiken als er ruimte is voor verwarring. Ook al zou de associativiteit hier uitsluitsel over geven. Bijvoorbeeld A || B && C volstaat in principe, maar A || (B && C) zou mij toch wat meer vertrouwen geven, ook al is het niet direct nodig.

Weet je trouwens zeker dat de precedentie van || voor problemen zorgt? Er bestaat namelijk in PHP zoiets als lazy evaluation. Indien het eerste deel iets retourneert dat verschilt van iets false-achtigs wordt het tweede deel niet uitgevoerd.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function test1() {
    echo '#1';
    return true;
}

function
test2() {
    echo '#2';
    return true;
}


$test = test1() || test2();
?>

Levert enkel '#1'. Nu is het toekennen van het resultaat van show_error() (als er uberhaupt een resultaat is) aan $fh waarschijnlijk onzinnig, maar ik suggereer nergens dat || en OR vrij inwisselbaar zouden zijn. Dus om nu alles te searchen en replacen lijkt mij onverstandig, je moet nog steeds interpreteren wat er gebeurt en dan inderdaad besluiten welke constructie je gebruikt.
 
PHP hulp

PHP hulp

24/11/2024 15:30:35
 
Willem vp

Willem vp

06/09/2019 16:03:40
Quote Anchor link
Thomas van den Heuvel op 06/09/2019 13:20:43:
Weet je trouwens zeker dat de precedentie van || voor problemen zorgt? Er bestaat namelijk in PHP zoiets als lazy evaluation. Indien het eerste deel iets retourneert dat verschilt van iets false-achtigs wordt het tweede deel niet uitgevoerd.

Ik drukte me wellicht niet helemaal zuiver uit. Als de fopen() lukt, is er niets aan de hand. Het probleem met '||' versus 'or' zit in de situatie dat fopen() mislukt, en dus 'false' teruggeeft. In dat geval krijgt (wanneer je || gebruikt) $fh de return value van show_error() in plaats van de return value van fopen().
 
Thomas van den Heuvel

Thomas van den Heuvel

07/09/2019 16:39:39
Quote Anchor link
Dat snap ik, de "denkbeeldige groeperingshaken" staan op verschillende plaatsen bij gebruikmaking van || of or.

Tegelijkertijd verlaat je bij uitvoering van show_error() de normale flow van het programma, of zou dit moeten gebeuren. Het is dan sowieso niet de bedoeling dat je verder gaat met bewerkingen op $fh. En het is dan dus ook in zekere zin niet (langer) relevant welke waarde $fh op dat moment heeft.

In dat opzicht heeft een or-constructie ook niet zoveel te maken met "flow", het lijkt eerder op het trekken aan de noodrem. Afhankelijk van het doel van het uitvoeren van de code zou je dit ook anders kunnen aanpakken.

show_error() suggereert een soort van visuele afhandeling. Dit in tegenstelling tot een importscript ofzo. Daar zou je misschien eerder "verwachten" dat invoer niet voldoet, en dat het script dan ook dan en daar stopt.

Wanneer er tijdens de verwerking van gegevens tussen twee (visuele) webpagina's iets misgaat is het inderdaad ook handig dat je hier eveneens een visuele terugkoppeling van krijgt. Maar dit is dan misschien weer meer "out of the ordinary" en is er in zekere zin sprake van een uitzondering. Voor dat soort gevallen zouden exceptions dus misschien beter zijn, maar het hangt er dus (ook) van af wat je precies aan het doen bent, en vooral ook in welke setting.

Ik gebruikte het vroeger ook heel vaak, dingen als "mysql_query() or die()", maar dat staat toch minder netjes middenin een webpagina. De afhandeling hiervan kan ook anders, en als de situatie hier om vraagt, subtieler.

(NB hiermee wil ik niet zeggen dat constructies met "and" of "or" in PHP-code achterhaald zouden zijn ofzo, het heeft gewoon, net als zoveel andere dingen, een specifiek toepassingsgebied)
Gewijzigd op 07/09/2019 16:42:04 door Thomas van den Heuvel
 
Ward van der Put
Moderator

Ward van der Put

07/09/2019 17:08:07
Quote Anchor link
Als je een or die() uitsluitend bij uitzonderingen wilt uitvoeren, zou je een and zo kunnen gebruiken:

$resultaat = doe_iets() and log_dat();
 

Pagina: « vorige 1 2



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.