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?
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.
//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.
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.
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 :-)