Both sides previous revision Previous revision Next revision | Previous revision |
programming:php-getter-setter [2014/06/21 11:55] – Giuseppe Di Terlizzi | programming:php-getter-setter [2015/01/07 01:30] (current) – Giuseppe Di Terlizzi |
---|
====== Getter & Setter in PHP ====== | ====== PHP: Getter & Setter ====== |
| |
{{http://php.net/images/php.gif }} Quanti di voi hanno speso tempo e righe di codice per scrivere metodi che impostano e recuperano i valori delle proprietà definite un una classe? E quanti di voi hanno pensato: ma esiste un modo più semplice e veloce per farlo? | {{http://php.net/images/php.gif }} Quanti di voi hanno speso tempo e righe di codice per scrivere metodi che impostano e recuperano i valori delle proprietà definite un una classe? E quanti di voi hanno pensato: ma esiste un modo più semplice e veloce per farlo? |
| |
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 aiutano lo sviluppatore nel semplificare la scrittura del codice per le proprie applicazioni web. | Con questo articolo vi mostrerò come utilizzare i "metodi magici" messi a disposizione da PHP5 per creare una semplice classe che implementa "automagicamente" i metodi **getter** e **setter**, aiutando lo sviluppatore nel semplificare la scrittura del codice per le proprie applicazioni web. |
| |
===== Codice ===== | ===== Codice ===== |
<?php | <?php |
| |
| /** |
| * PHP5 Getter/Setter |
| * |
| * @author Giuseppe Di Terlizzi <giuseppe.diterlizzi@gmail.com> |
| */ |
class GetterSetter { | class GetterSetter { |
| |
| |
$property = lcfirst(substr($method, 3)); | $property = lcfirst(substr($method, 3)); |
| $prefix = strtolower(substr($method, 0,3)); |
| |
if (! property_exists($this, $property)) { | if ($prefix == 'set' && ! isset($arguments[0])) { |
trigger_error(sprintf("Undefined method %s::%s()", get_class($this), $method)); | trigger_error(sprintf('Missing argument 1 for %s::%s()', get_class($this), $method)); |
| return; |
} | } |
| |
switch (substr($method, 0,3)) { | if (! property_exists(get_class($this), $property)) { |
| trigger_error(sprintf('Undefined method %s::%s()', get_class($this), $method)); |
| return; |
| } |
| |
| switch ($prefix) { |
| |
case 'get': | case 'get': |
| |
case 'set': | case 'set': |
return $this->$property = @$arguments[0]; | return $this->$property = $arguments[0]; |
} | } |
| |
| |
public function __get($property) { | public function __get($property) { |
return call_user_func_array(array($this, "get".ucfirst($property)), array()); | return call_user_func_array(array($this, 'get'.ucfirst($property)), array()); |
} | } |
| |
public function __set($property, $value) { | public function __set($property, $value) { |
return call_user_func_array(array($this, "set".ucfirst($property)), array($value)); | return call_user_func_array(array($this, 'set'.ucfirst($property)), array($value)); |
} | } |
| |
===== Spiegazione ===== | ===== Spiegazione ===== |
| |
La classe ''GetterSetter'' è composta da solo 3 metodi ed adesso vi spiegherò brevemente cosa abbiamo fatto: | La classe ''GetterSetter'' è composta da solo 3 metodi ed adesso vi spiegherò brevemente che cosa fa: |
| |
* Il metodo "magico" %%"__call"%%, viene invocato per restiuire o impostare un valore della prorietà desiderata. | * Il metodo "magico" %%"__call"%%, viene invocato per restiuire o impostare un valore della prorietà desiderata. |
* La ''substring'' recupera il nome della proprietà togliendo i primi 3 caratteri e la funzione "property_exists" verifica se la proprietà è definita nella classe. Nel caso non esiste restiuisce un eccezione indicando che il metodo è inesistente. | * Una ''substring'' recupera il nome della proprietà togliendo i primi 3 caratteri. |
* Un'altra ''substring'' recupera i primi 3 caratteri del metodo per capire se stiamo "recuperando" (get) o "impostando" (set) la proprietà | * 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. | * Se stiamo settando una proprietà viene verificato se viene passato un valore come argomento. Nel caso non passiamo niente restiuisce un messaggio d'errore. |
| * Un'altra ''substring'' recupera i primi 3 caratteri del metodo per capire se stiamo "recuperando" (get) o "impostando" (set) la proprietà. |
| * I metodi %%"__get"%% e %%"__set"%% permettono di richiamare e settare le proprietà direttamente senza chiamare il relativo metodo get/set. |
| |
===== Utilizzo ===== | ===== Utilizzo ===== |
Come potete vedere dall'esempio possiamo accedere alla proprietà ''MyObject::$foo'' sia utilizzando il metodo "virtuale" (''$MyObject->getFoo()'') che direttamente (''$MyObject->foo''). | Come potete vedere dall'esempio possiamo accedere alla proprietà ''MyObject::$foo'' sia utilizzando il metodo "virtuale" (''$MyObject->getFoo()'') che direttamente (''$MyObject->foo''). |
| |
A questo punto, una domanda sorge spontanea: //Cosa succede se tentiamo di recuperare o impostare una proprietà inesistente?// | ===== FAQ ===== |
| |
Come detto prima nel caso in cui tentiamo di accedere ad una proprietà non definita verrà restituita un'eccezione. | ==== Cosa succede se tentiamo di recuperare o impostare una proprietà inesistente? ==== |
| |
| Nel caso in cui tentiamo di accedere ad una proprietà non definita verrà restituita un'eccezione. |
| |
<code php> | <code php> |
$MyObject->getBaz(); | $MyObject->getBaz(); |
| |
//Notice: Undefined method MyObject::getBaz() in /home/peppe/www/GetterSetter.php on line 10 | //Notice: Undefined method MyObject::getBaz() in /home/lotar/www/GetterSetter.php on line 10 |
</code> | </code> |
| |
| ==== Se non passiamo nessun valore al metodo setXYZ, cosa succede? ==== |
| |
| Anche in questo caso viene restituito un messaggio d'errore indicando che il metodo richiamato non ha un argomento. |
| |
| <code php> |
| $MyObject->setBaz(); |
| |
| //Notice: Notice: Missing argument 1 for MyObject::setBaz() in /home/lotar/www/GetterSetter.php on line 10 |
| </code> |
| |
Buona programmazione! | Buona programmazione! |