Als ik parameters instel in een klasse doe ik altijd gewoon:
<?php
class Route
{
protected $pattern;
// ...

public function __construct($pattern)
{
$this->pattern = (string) $pattern;
// ...
}
}
?>

Alleen nu kwam ik in de Symfony source dit tegen:
<?php
class Route
{
protected $pattern;
// ...

public function __construct($pattern)
{
$this->setPattern($pattern);
// ...
}

public function setPattern($pattern)
{
$this->pattern = (string) $pattern;
}
}
?>

Eigenlijk vind ik dit wel mooi. Je verdeelt zo de verantwoordelijkheden, de constructor moet niet van de properties beslissen hoe ze worden opgeslagen, daar hebben ze een eigen setter voor. En als je nou iets daarin wilt aanpassen, zoals dat een username altijd met een hoofdletter begint, hoef je alleen de setter aan te passen.

Maar aan de andere kant bezorgt dit je ook weer wat extra werk en een extra method call. Wat vinden jullie mooier/wat gebruiken jullie altijd?
Ah, het is duidelijk. Ik heb het altijd verkeerd gedaan en je hoort het met setters en getters te doen.
Jan Koehoorn op 24/07/2012 21:25:49

Er wordt ook vaak gebruik gemaakt van de magic methods __get en __set. Dan hoef je namelijk niet voor elke membervariabele een aparte setter en getter te schrijven. Opzetje:

<?php
class myClass {
    public $data = array ();

    public function  __get ($key) {  
        if (array_key_exists ($key, $this->data)) {  
            return $this->data[ $key ];  
        }  
        return null;  
    }
    public function __set ($key, $value) {
        $this->data[ $key ] = $value;
    }
}
?>
(Code niet gecheckt)



Dit gebruik ik zelf ook vaak, erg fijn!
Echter niet in high-performance applicaties. Dit is namelijk zo traag als dikke stront door een trechter.. omhoog :')
Dit geldt voor veel 'magic methods' overigens.

Note ook dat dit ook niet kan voor static properties.
Note ook dat dit ook niet kan voor static properties.

En ook niet voor public properties.

En wat is er eigenlijk zo fijn aan? Het voegt naar mijn mening niks meer toe dan de normale omstandigheden?
Wouter J op 25/07/2012 15:26:19

En ook niet voor public properties.


Tuurlijk wel, waarom zou dat niet kunnen?

<?php
class Voorbeeld{
public test;

//zet de property test naar 'test voorbeeld' wat er ook gegeven mogen zijn
public function __set( $name ){
$this->test = 'test voorbeeld';
}
}

$obj = new Voorbeeld();
$obj->test = 'een andere string';
echo $obj->test;
?>
Wat denk je dat er geprint wordt?
Daarom kan je dus geen magic setter gebruiken voor een public property.
nu ja ...

Als je een eigenschap als public zet, weet je dat ze kan overschreven worden.
Als je niet wil dat dit kan, moet je ze maar op private/protected zetten.

Of het nu kan of niet (die magic set en get), lijkt me meer een discussie die niet echt ter zake is.

Erwin H op 25/07/2012 12:44:13

Je spreekt hem aan via de setter en leest hem uit via de getter. Dat is de normale gang van zaken inderdaad....

Nee, je stelt een property in via een setter en je spreekt deze property aan (je leest de waarde van die property uit) via een getter.
Volkomen doelloze discussie dit, maar zoals je weet ben ik daar altijd wel voor te porren.

Definitie aanspreken:

1) beginnen te praten tegen (iemand)
2) zo zijn dat iemand het mooi of aangenaam vindt
3) (een reserve) gaan gebruiken

Als je de eerste als uitgangspunt neemt dan kan je het uitleggen als iets geven, iets 'setten' dus.
Als je de derde neemt kan je het lezen als iets opnemen, als iets 'getten'.


Volgens mij spreek je een property dus aan via de setters EN de getters :-)
euh... juist ja ;-)
het wordt nu inderdaad vrij zinloos :-D

Reageren