Wat is dit voor vreemde if-constructie met meerdere returns. Hoe werkt zoiets?
<?php
function optimized_strpos($ErrLevel, $ErrMessage) {
if ($ErrLevel == E_RECOVERABLE_ERROR
// order this according to what your app uses most
return strpos($ErrMessage, 'must be an instance of string, string')
|| strpos($ErrMessage, 'must be an instance of integer, integer')
|| strpos($ErrMessage, 'must be an instance of float, double')
|| strpos($ErrMessage, 'must be an instance of boolean, boolean')
|| strpos($ErrMessage, 'must be an instance of resource, resource');
}
?>
return (true || false);
// is het zelfde alse
return true || false;
// je zou het ook kunnen schrijven als
$a = strpos($ErrMessage, 'must be an instance of string, string');
$b = strpos($ErrMessage, 'must be an instance of integer, integer');
$c = strpos($ErrMessage, 'must be an instance of float, double');
$d = strpos($ErrMessage, 'must be an instance of boolean, boolean');
$e = strpos($ErrMessage, 'must be an instance of resource, resource');
return ($a !== FALSE OR $b !== FALSE OR $c !== FALSE OR $d !== FALSE OR $e !== FALSE OR);
// Mocht strpos ooit 0 returnen dan is het dus duidelijk niet de melding "Argument _nummer_ passed to _functie_ blabla". Dus 0 en FALSE zijn beiden niet wat je wilt, waardoor je het simpeler kan schrijven als
return ($a OR $b OR $c OR $d OR $e);
?>
Die constructie die je ziet is ietsjes effecienter met geheugen omdat je geen variabele aanmaakt.
Wat wil dat zeggen... hoe weet je nu wat er wordt gereturned? Misschien stel ik de vraag een beetje onduidelijk, maar ik zie dus een return met daarin meerdere waardes die kunnen worden gereturned. Wanneer wordt wat gereturned? Dat is eigenlijk mijn vraag... ik kan me niet herinneren dat ik ooit een return heb gezien waarin meerdere opties staan.
Ozzie, wanneer er iets true-ish (getallen behalve 0, strings behalve lege string, true, etc.) uit komt. strpos returned false wanneer de string niet is gevonden en de positie wanneer die wel is gevonden. Dat wordt dan dus gereturned.
Ik begrijp zelf het hele nut ook niet van die functie trouwens...
Zoals ik al zei is het een hack: http://3v4l.org/Tl9VT
De reden dat ik het op bracht is omdat het een voorbeeld is dat bewijst dat catchable error niet via een catch block, maar alleen via de geregistreerde error handler op te vangen zijn.
Ik raad niet aan dit te gebruiken, maar het is wel leuk om te weten dat het kan.
PS. wat wel kan is in de error handler de error omzetten in een exception en daarna de exception te catchen. Maar je hebt dus nog steeds een error handler nodig.