PHP fornisce un insieme di costanti predefinite e metodi magici per i nostri programmi. A differenza delle normali costanti i quali si impostano con define(), il valore delle costanti predefinite o speciali dipendono da dove vengono utilizzati nel codice e sono utilizzati per accedere a informazioni di sola lettura sul proprio codice PHP. I metodi magici sono metodi riservati che si possono utilizzare nelle classi per agganciare una particolare funzionalità di PHP.
Se non avete ancora sentito parlare di metodi magici in PHP e costanti speciali, allora questo articolo fa per voi! Ho una raccolta di quelli più utili e come è possibile utilizzarle nel codice. Provo a condividerlo.
Costanti predefinite

Le costanti predefinite sono utilizzate per accedere alle informazioni sul codice. Le costanti si scrivono con le lettere maiuscole tra il doppio underscore, come __LINE__ e __FILE__ per esempio. Ecco alcune delle costanti utili che vengono messe a disposizione da PHP:

__LINE__ restituisce il numero di riga del file dove appare la costante

Copia codice

<?php
echo "linea num.: " . __LINE__; // linea num.: 3
echo "linea num.: " . __LINE__; // linea num.: 4
echo "linea num.: " . __LINE__; // linea num.: 5
?>
__FILE__ rappresenta il nome del file, compreso il suo percorso completo
Copia codice

<?php
// presumendo che questo file si chiami index.php
echo "la directory e il nome del file è: " . __FILE__;
// stampa ...
// la directory e il nome del file è: C:\usr\www\index.php
?>
__DIR__ rappresenta solo il percorso del file
Copia codice

<?php
echo "la directory di questo file è: " . __DIR__;
// stampa ...
// la directory di questo file è: C:\usr\www
?>
__CLASS__ restituisce il nome della classe corrente
Copia codice

<?php
class Esempio {
   public function __construct() {
      echo __CLASS__;
   }
}
$obj = new Esempio(); // stampa Esempio
?>
__FUNCTION__ restituisce il nome della funzione corrente
Copia codice

<?php
function miaFunzione() {
   echo  "il nome della funzione è: " . __FUNCTION__;
}
miaFunzione(); // il nome della funzione è: miaFunzione
?>
</pre>
<code>__METHOD__</code> rappresenta il nome del metodo corrente
<pre class="brush: php; title: ; notranslate" title="">
<?php
class Esempio {
   public static function mioMetodo() {
      echo  "il nome del metodo è: " . __METHOD__;
   }
}
Esempio::mioMetodo(); // il nome del metodo è: mioMetodo
?>
__NAMESPACE__ rappresenta il nome dello spazio di nomi corrente
Copia codice

<?php
namespace mioNameSpace;
echo "lo spazio di nomi è: " . __NAMESPACE__;
// o spazio di nomi è: mioNameSpace
?>
Metodi magici
I metodi magici forniscono un gancio su speciali comportamenti di PHP. A differenza delle precedenti costanti, i loro nomi sono scritti con lettere maiuscole/cammellizzate (CamelCase o, come viene spesso definito, con la notazione ungherese) e con il doppio underscore all’inizo del nome, come __construct() e __destruct().
__construct() è il metodo magico che PHP invoca per creare istanze di oggetti di classe. Accetta qualsiasi numero di argomenti.
Copia codice

<?php
class MioEsempio {
   public function __construct($foo) {
      echo "Il costruttore di " . __CLASS__;
      echo " è stato invocato con " . $foo;
   }
}
$obj = new MioEsempio(69);
// Il costruttore di MioEsempio è stato invocato con 69
?>
Come suggerisce il nome, il metodo __destruct() viene chiamato quando l’oggetto viene distrutto dal Garbage Collector di PHP. Non accetta argomenti ed è comunemente usato per eseguire operazioni di pulizia che possono essere necessari come nella chiusura di una connessione al database.
Copia codice

<?php
class MioEsempio {
   public function __destruct() {
      echo "Il distruttore della classe ";
      echo __CLASS__ . " è stato invocato.";
   }
}
$obj = new MioEsempio;
// Il distruttore della classe MioEsempio è stato invocato.
?>
I prossimi metodi magici affrontano la proprietà di sovraccarico (overloading), e forniscono un modo a PHP per gestire le chiamate a proprietà e metodi che non sono stati definite (o non sono accessibili a noi).
PHP invoca il metodo __get(), se una proprietà è indefinita (o inaccessibili) in un contesto getter. Il metodo accetta come argomento il nome della proprietà. Dovrebbe restituire il valore che viene considerato come valore della proprietà.
Il metodo __set() viene chiamato per le proprietà non definite in un contesto setter. Esso accetta due argomenti, il nome della proprietà e un valore.
Copia codice

<?php
class MioEsempio {
   private $mioArray = array();
   public function __set($prop, $valore) {
      $this->mioArray[$prop] = $valore;
   }
   public function __get($prop) {
      return $this->mioArray[$prop];
   }
   public function __isset($prop) {
      return isset($this->mioArray[$prop]);
   }
   public function __unset($prop) {
      unset($this->mioArray[$prop]);
   }
   public function __toString() {
      return __CLASS__ . ":" . $this->nome;
   }
}
$obj = new MioEsempio();
if (!isset($obj->nome)) {
   $obj->name = "Pluto";
}
echo $obj->nome; // Pluto
echo $obj; // MioEsempio:Pluto
?>
Nel codice dell’esempio precedente, la proprietà nome non è definita nella classe. Quando si tenta di assegnare il valore in “MioEsempio”, PHP invoca il metodo magico __set(). Riceve “nome” come argomento di $prop e “Pluto” come $valore, per conservare il valore nella matrice privata $mioArray. Il metodo __get() funziona in modo simile, quando si esegue l’output di $obj->name, viene chiamato il metodo __get() e “nome” viene passato come argomento di $prop.
Ci sono altri metodi magici che ci aiutano con il recupero e il controllo di variabili membro inaccessibili come appare nel codice di esempio: __isset(), __unset(), e __toString(). Sia __isset() e __unset() vengono attivate dalle funzioni con lo stesso nome (senza l’underscore) in PHP.
__isset() controlla se la proprietà è impostata o meno, e accetta un argomento che è la proprietà che vogliamo testare. __unset() riceve un argomento che è il nome della proprietà che si vuole disinserire o eliminare.
In molti casi, rappresentare un oggetto come una stringa è utile, ad esempio per l’output di un utente o per un altro processo. Normalmente PHP li presenta con un ID nella memoria, che per noi non è facile arrivarci. Il metodo __toString() ci aiuta a rappresentare l’oggetto come una stringa. Il metodo viene attivato in qualsiasi situazione in cui viene usato l’oggetto come una stringa, ad esempio: echo "Ciao $obj";. Può anche essere chiamato direttamente come qualsiasi altro metodo pubblico, per esempio, come aggiungere una stringa vuota per forzare la coercizione.
Riassunto
La programmazione OOP è in grado di produrre una migliore gestione e controllo del codice. Ci aiuta a creare uno standard migliore nel codice PHP. Inoltre, ci permette di usufruire di metodi magici e di costanti speciali che PHP mette a disposizione.