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?
Ozzie, dat heb ik je al eens eerder uitlegt, maar maakt niet uit :) PHP kan zonder problemen "type jugglen" tussen ints en strings, dus als je een int geeft waar je een string verwacht maakt PHP gewoon leuk een string van die int. Als je een string hebt waar je een int verwacht gaat het iets krommer, maar het eind resultaat is hetzelfde: Je krijgt alsnog een int. ("abc123" wordt 123)
Een array kan PHP niet op die manier "type jugglen" naar een string of een int. Bij het omzetten naar een string krijg je "Array", totaal niet wat je verwacht. Bij het omzetten naar een int zal je 0 of 1 krijgen, en als je dat doet doormiddel van rekenoperator krijg je "Fatal error: Unsupported operand types".
Het typehinten van objecten is gewoon volledig omdat dat 1 van de keyprincipes is van OOP.
Ah, dankjewel voor de opfrisser Wouter!

Maar ergens ook wel een beetje inconsequent...

<?php

public function setProductProperties($code, array $properties) {

}

?>
Hier weet je dus dat $properties een array moet zijn, maar wat is $code? Een int of een string?

Ik denk trouwens dat het in de praktijk voldoende is om alleen objecten te typehinten. Als het goed is kun je aan de naam van de variabele zien of iets een array is, omdat de naam dan meervoud is: properties (array) versus property (string).
Ozzie, type hinting is alleen handig voor de code. Het maakt niet uit of het een int of een string is, aangezien het beide in beide gevallen bruikbaar is.

Dat een argument meervoudig of enkelvoudig heeft ook totaal geen nut, dat weet PHP niet. Het type hinten op classen en arrays heeft de code als doel, niet de documentatie.
Laatste vraag, anders dwalen we te veel af...

Wat is dan het nut van het typehinten van een parameter? Dat is toch om te voorkomen dat je een verkeerd type opgeeft? Want als je dit hebt:

<?php
public function foo(array $bar) {

}
?>
En je geeft een int als argument in plaats van een array, dan krijg je een foutmelding. In die zin is het toch een vorm van documentatie, zodat je zelf weet wat $bar zou moeten zijn?
(php.net)>>Failing to satisfy the type hint results in a catchable fatal error.
Met andere woorden een exception.
Een error is toch geen exception? Maar wat ik eigenlijk bedoel is... het is toch een soort documentatie? Het doet verder toch niets? Stel ik geen bijv. een int op ipv een array, dan maakt ie daar niet ineens een array van. Dus wat is dan het nut? Volgens mij alleen dat je kunt zien wat er voor type verwacht wordt...

[offtopic]
Ward, geef je aub even een gil als we te veel afdwalen, of als je nog vragen hebt?
[/offtopic]
Waarom kan een error geen exception zijn??

En nee, typehinting is geen documentatie maar het afdwingen van de juiste parameters.
Ik bedoel... in PHP is een error toch iets anders dan een Exception?

Oké... maar als ik dus het verkeerde type opgeef, dan volgt er een error. Het is niet zo dat dit type dan wordt omgezet naar het juiste type. Dat bedoel ik eigenlijk.
>> Ik bedoel... in PHP is een error toch iets anders dan een Exception?

Sommige errors wel. Dit is een catchable fatal error, iets wat je kunt opvangen in een catch statement dus.
>> Sommige errors wel. Dit is een catchable fatal error, iets wat je kunt opvangen in een catch statement dus.

Pfff, ik blijf iedere dag nieuwe dingen leren. En catch ik die gewoon als een algemene exception? Dus zo:

<?php
try {

} catch(Exception $e) {

}
?>
Of werkt dat op een andere manier?

Reageren