Bij het doorspitten van verschillende PHP OOP-projecten viel me op dat er twee stijlen in omloop zijn voor het declareren van een array in een klasse.

Sommigen declareren direct een array in de class properties:

<?php
class FooBar
{
    private $foo = array();
    private $bar = array();

    // <...>
}
?>

Anderen bewaren het voor de constructor of stellen het uit tot een setter wordt aangeroepen, schematisch:

<?php
class FooBar
{
    private $foo;
    private $bar;

    public function __construct()
    {
        $this->foo = array();
        // <...>
    }

    public function setBar($params)
    {
        $this->bar = array();
        // <...>
    }
}
?>

Wat zijn eigenlijk de voor- of nadelen van beide stijlen? En geldt hiervoor een best practice?
Dos Moonen op 19/01/2014 11:45:05

Niet in een catch statement, maar in je error handler. Een interessante hack: http://www.php.net/manual/en/language.oop5.typehinting.php#111411

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 (false || false || true || false || false); maar dan met functies inplaats van hard coded booleans.
Ik snap eigenlijk de constructie niet... hoe kun je op basis van 1 if meerdere returns krijgen?
Er is maar een return.

<?php

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.
Dos, ik snap het nog steeds niet... sorry... :-/

return ($a OR $b OR $c OR $d OR $e);

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.
Thanks heren, duidelijk!

Reageren