Hallo,

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...
De enige manier om 100% zeker te zijn dat iets een array of een instance van een class/interface is doe je door niet te vertrouwen op type hinting: http://3v4l.org/oObfK
Catchable fatal errors kun je overrulen, waarna de uitvoer van je script leuk verder gaat.
Haha, maar dan ga je het bewust overrulen. Dan ben je toch gewoon stom bezig? Lijkt me een beetje vergezocht hoor...
Ozzie PHP op 29/01/2014 11:28:48

Dan ben je toch gewoon stom bezig?

Ja, behoorlijk. Maar dat maakt het niet minder waar :p
Dat is ook weer zo :)
Als je niet meer kunt vertrouwen op type hints dan is eigenlijk het complete OO PHP systeem om zeep geholpen...

Dan krijg je een beetje een Ruby structuur: Een taal waarin alles, maar dan ook alles, een object is en waarbij je niet kan typehinten. Als jij zo dom bent om een Person object in een definition te stoppen die een Animal object verwacht, dan zul je dat wel ergens verder in een andere error vinden...
In Java met reflection een (per definitie immutable) String object aanpassen is vergelijkbaar. Het is absoluut mogelijk, maar iedereen gaat er van uit dat niemand het doet.

Reageren