Onzichtbare setters en getters part 2

Hallo trouwe lezers.. Het leven is op ‘t moment te druk voor woorden, kom niet eens toe aan world of warcraft spelen. Duidelijk tijd tekort dus. Maar dan nu toch een artikel.

Vorige keer heb ik een artikel geschreven over Onzichtbare getters en setters, opzich een leuk concept, als je het van de andere kant bekijkt, zou je alleen altijd getters en setters moeten hebben voor het geval je valdatie toe wilt voegen. Natuurlijk kan je dat allemaal doen met een goede IDE. Aangezien ik op werk met vim zit te klooien, heb ik een leuk alternatief verzonnen.

/** Vergeet niet dat deze functie binnen een class thuishoort **/
public function __call($function, $args)
{
    // Set method, match en sla de variable-naam op in $matches
    if ( preg_match('/^set([A-Z])([0-9a-zA-Z]*)$/', $function, $matches) )
    {
        // Maak de eerste letter lowercase
        $key = strtolower($matches[1]).$matches[2];
        // Zet de variable
        $this->$key = array_shift($args);

        // Mijn gewoonte met void functies
        return $this;
    }

    // Set method, match en sla de variable-naam op in $matches
    if ( preg_match('/^get([A-Z])([0-9a-zA-Z]*)$/', $function, $matches) )
    {
        // Maak de eerste letter lowercase
        $key = strtolower($matches[1]).$matches[2];

        // Als de variable niet bestaat, return dan null
        if ( !isset($this->$key) )
        {
            return null;
        }

        // Return de waarde
        return $this->$key;
    }

    throw new Exception('Calling undefined function.');
} 

Werkt prima zo, alle variablen die gewoon met een letter beginnen hebben op deze manier een setter en een getter (maak ze wel protected of private). Wil je echt dat een bepaalde variable niet aangesproken kan worden buiten de classe, laat hem dan met een underscore “_” beginnen.

En zoals altijd, comments zijn welkom, scheld me alsjeblieft uit dat ik niet actief op mijn blog ben geweest…

Cheers!

Voorbeeld

Ga er vanuit dat de classe B de bovenstaande functie bevat.

class A extends B
{
    protected $var1;
    protected $test;
    protected $testVar2 = 'hallo';
}

$a = new A();
// Setters
$a->setVar1('test')
  ->setTest('Sup?');

// Getter
echo $a->getTestVar2();

// Nog een Setter
$a->setTestVar2('iets anders');

// Het resultaat
print_r($a);

4 Responses to “Onzichtbare setters en getters part 2”

  1. Nino says:

    Waarom gebruik je geen __get ipv __call ?
    Dan wordt die functie niet aangeroepen wanneer public vars worden aangesproken. Alleen bij vars die niet aan te spreken zijn / niet bestaan.
    Dus hoef je in je __get functie alleen te kijken of die intern bestaat en eventueel dus afhandelen met een functie.

    • Reen says:

      Ha trouwe lezer :P

      Misschien had ik een voorbeeld code erbij moeten, stoppen. Doe ik gelijk even.

      Het idee is om automatisch setters en getters te maken voor alle variablen die niet met een onderscore beginnen. Zie het gewijzigde artikel in een paar minuutjes.

  2. Nino says:

    Ja, zo kan het ook, zat te denken dat je gewoon $obj->var ging aanspreken. En die dus op dat moment wou valideren door hem tussentijds door een functie te halen.

    vars waar je geen validatie nodig hebt kun je dus public laten, en die je wilt valideren protected / private maken.

Leave a Reply