programming:php-getter-setter

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
programming:php-getter-setter [2014/06/21 11:55] Giuseppe Di Terlizziprogramming:php-getter-setter [2015/01/07 01:30] (current) Giuseppe Di Terlizzi
Line 1: Line 1:
-====== 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 =====
Line 11: Line 11:
 <?php <?php
  
 +/**
 + * PHP5 Getter/Setter
 + 
 + * @author  Giuseppe Di Terlizzi <giuseppe.diterlizzi@gmail.com>
 + */
 class GetterSetter { class GetterSetter {
  
Line 16: Line 21:
  
     $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':
Line 27: Line 39:
  
       case 'set':       case 'set':
-        return $this->$property = @$arguments[0];+        return $this->$property = $arguments[0]; 
     }     }
  
Line 33: Line 46:
  
   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));
   }   }
  
Line 45: Line 58:
 ===== 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 esisterestiuisce 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 =====
Line 92: Line 107:
 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!
  • programming/php-getter-setter.1403344509.txt.gz
  • Last modified: 10 years ago
  • by Giuseppe Di Terlizzi