Script wordt niet goed uitgevoerd
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.
...
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)
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.
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().
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
$resultaat = doe_iets() and log_dat();