This is an old revision of the document!
Getter & Setter in PHP
Con questo articolo vi mostrerò come utilizzare i “metodi magici” messi a disposizione da PHP5 per creare una semplice classe che implementa i metodi getter e setter, che possono aiutare lo sviluppatore nel semplificare la scrittura del codice per le proprie applicazioni web.
Codice
- GetterSetter.php
<?php class GetterSetter { public function __call($method, $arguments) { $property = lcfirst(substr($method, 3)); if (! property_exists($this, $property)) { trigger_error(sprintf("Undefined method %s::%s()", get_class($this), $method)); } switch (substr($method, 0,3)) { case 'get': return $this->$property; case 'set': return $this->$property = @$arguments[0]; } } public function __get($property) { return call_user_func_array(array($this, "get".ucfirst($property)), array()); } public function __set($property, $value) { return call_user_func_array(array($this, "set".ucfirst($property)), array($value)); } }
Adesso vi spiegherò brevemente cosa abbiamo fatto:
- Il metodo “magico” "__call" viene invocato per restiuire o impostare un valore della prorietà desiderata.
- Una substring recupera il nome della proprietà e la funzione “property_exists” verifica se la proprietà è definita nella classe. Nel caso non esiste restiuisce un eccezione indicando che il metodo è inesistente.
- I metodi "__get" e "__set" permettono di richiamare e settare le proprietà direttamente senza chiamare il metodo.
Adesso creaiamo una classe che estende la classe GetterSetter
e definiamo delle proprietà a piacere:
<?php include 'GetterSetter.php'; class MyObject extends GetterSetter { public $foo = 'bar'; public $bar = 'baz'; }
Adesso basta istanziare la classe e testarla:
<?php $MyObject = new MyObject; var_dump($MyObject->getFoo()); //string(3) "bar" $MyObject->setFoo('foo'); var_dump($MyObject->getFoo()); //string(3) "foo" var_dump($MyObject->bar); //string(3) "baz" $MyObject->bar = 'bar'; var_dump($MyObject->bar); //string(3) "bar"
Come potete vedere dall'esempio possiamo accedere alla proprietà MyObject::$foo
sia dal metodo “virtuale” MyObject::getFoo()
che direttamente.
Adesso sorge una domanda: Cosa succede se tentiamo di recuperare o impostare una proprietà inesistente? Come detto prima nel caso in cui tentiamo di accedere ad una proprietà non definita verrà restituita un'eccezione.
$MyObject->getBaz(); //Notice: Undefined method MyObject::getBaz() in /home/peppe/www/GetterSetter.php on line 10
Buona programmazione!