Nog even een vraagje over een array typehint. En dan heb ik het over deze, tadaaa... :
<?php
public function foo(array $bar) {
}
?>
Als $bar nu geen array is maar een int, dan is dit de foutmelding:
"PHP Catchable fatal error: Argument 1 passed to foo() must be of the type array, integer given ..."
Als ik dit doe, geen typehint... en $bar is weer een int in plaats van een array...
<?php
public function foo($bar) {
foreach ($bar as $kruk) {
echo $kruk;
}
}
?>
Dan is dit de foutmelding:
"PHP Warning: Invalid argument supplied for foreach() ..."
De eerste foutmelding is dus een catchable fatal error en de tweede foutmelding is een warning. Nu vraag ik me af of hier een verschil in zit. In allebei de gevallen gaat het fout. Zit er dan nog een voordeel aan zo'n catchable fatal error? Dat begrijp ik nog niet helemaal eigenlijk...
fatal error -> PHP stopt volledig
catchable fatal error -> PHP stopt, maar jij mag de fout afhandelen
warning -> er is een fout, maar PHP gaat door alsof zijn neus bloed
Aha, duidelijke uitleg... en wat is dan eigenlijk "gebruikelijk"? Wel of niet typehinten?
Als ik je dus goed begrijp, met typehint: als er ergens een int wordt ingegeven ipv een array ligt je applicatie plat. Als er alleen een warning wordt gegeven gaat het door, alleen wordt de foreach niet uitgevoerd. Correct? Maar wat moet je dan eigenlijk willen vraag ik me af? Of is dat weer een persoonlijke keuze?
Ik zou altijd valideren waar ik moet valideren. Die parameter moet een array zijn, dus daar limiteren we op. Als je beide wil toestaan dan doen we dat niet daar, maar bouwen we een ifje in.
Een applicatie als een kip zonder kop laten doorlopen en maar zien waar het fout gaat is een beetje als een Ruby programmeur programmeren. Niks ergs aan, maar niet echt gebruikelijk in PHP. In PHP willen we het liefst meer de C en JAVA kant op: Alles controleren en als een kip met honderd koppen rondlopen.
Wat het beste is? In elk geval niet de Hollandse "gulden middenweg". Code moet consistent blijven, dus kies 1 methode en pas dat overal toe: (a) controleren voor het fout gaat of (b) laten fout gaan wanneer je er zelf voor hebt gezorgd dat het fout gaat.
Thanks Wouter. Je uitleg wordt steeds beter overigens ;)
"Die parameter moet een array zijn, dus daar limiteren we op."
Dat lijkt me een goed uitgangspunt.
Je weet dat ik nogal van de snelheid ben en zo'n typehint is een extra controle, dus levert iets vertraging op... maar hé... ik vind het steeds belangrijker worden om ook "solide" code te schrijven, en in dit geval lijkt me dat zwaarder wegen dan de snelheidswinst. Dus ik denk dat ik voortaan ook maar ga typehinten... Goed plan?
Goed punt Ger. Maar ik liet die controle zoals in jouw optie 1 te zien is gewoon weg. Mijn idee was dat ik gewoon goed moest opletten dat ik altijd een array doorgeef.
Nou, omdat ik de enige ben die aan mijn code knutselt, ben ik het wel zelf, en als ik user input erin zou stoppen, dan zou ik de controle vooraf al doen.
Precies, jij bent de enige die van de code gebruikt maakt.
Maar dan zeg je in een ander topic:
Het is een functie om een directory aan te maken, maar die komt wel van mijzelf af. Alleen zou ik/je de betreffende method kunnen "misbruiken" door een slash in het argument te plaatsen. De method zou dan iets kunnen doen, waar ie niet voor is bedoeld. Om dat te voorkomen wil ik de slashes eruit filteren.
Klopt. Er is geen verschil. Ik was hier vroeger wellicht iets te "nonchalant" in. Liever iets snellere code en er vanuit gaan dat ik zelf wel altijd zo slim ben om het juiste type aan te leveren. Nu ben ik dus van die gedachte aan het afstappen, en vraag ik me af of het niet beter is om dit soort extra controles toch maar wel te implementeren. Mijn gedachte daarbij is dat het wellicht iets trager is (maar merk je dat in de praktijk?) maar dat de code er wel meer "solide" van wordt.