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:37] 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 ======
  
-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.+{{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 "automagicamente" i metodi **getter** e **setter**, aiutando lo sviluppatore nel semplificare la scrittura del codice per le proprie applicazioni web.
  
 ===== Codice ===== ===== Codice =====
Line 9: Line 11:
 <?php <?php
  
 +/**
 + * PHP5 Getter/Setter
 + 
 + * @author  Giuseppe Di Terlizzi <giuseppe.diterlizzi@gmail.com>
 + */
 class GetterSetter { class GetterSetter {
  
Line 14: 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 25: Line 39:
  
       case 'set':       case 'set':
-        return $this->$property = @$arguments[0];+        return $this->$property = $arguments[0]; 
     }     }
  
Line 31: 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 41: Line 56:
 </file> </file>
  
-Adesso vi spiegherò brevemente cosa abbiamo fatto:+===== Spiegazione =====
  
-  * Il metodo "magico" %%"__call"%% viene invocato per restiuire o impostare un valore della prorietà desiderata. +La classe ''GetterSetter'' è composta da solo 3 metodi ed adesso vi spiegherò brevemente che cosa fa:
-  * 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:+  * Il metodo "magico" %%"__call"%%, viene invocato per restiuire o impostare un valore della prorietà desiderata. 
 +    * Una ''substring'' recupera il nome della proprietà togliendo i primi 3 caratteri. 
 +    * La funzione "property_exists" verifica se la proprietà è definita nella classe. Nel caso non esiste, restiuisce un eccezione indicando che il metodo è inesistente. 
 +    * 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 ===== 
 + 
 +Adesso creiamo una classe che estende la classe ''GetterSetter'' e definiamo delle proprietà a piacere:
  
 <code php> <code php>
Line 83: Line 105:
 </code> </code>
  
-Come potete vedere dall'esempio possiamo accedere alla proprietà ''MyObject::$foo'' sia dal metodo "virtuale" ''MyObject::getFoo()'' che direttamente.+Come potete vedere dall'esempio possiamo accedere alla proprietà ''MyObject::$foo'' sia utilizzando il metodo "virtuale" (''$MyObject->getFoo()''che direttamente (''$MyObject->foo'').
  
-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.+===== FAQ ===== 
 + 
 +==== 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> 
 + 
 +==== 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> </code>
  
  • programming/php-getter-setter.1403343428.txt.gz
  • Last modified: 10 years ago
  • by Giuseppe Di Terlizzi