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
__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
<?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
<?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
<?php
echo "la directory di questo file è: " . __DIR__;
// stampa ...
// la directory di questo file è: C:\usr\www
?>
__CLASS__
restituisce il nome della classe corrente
<?php
class Esempio {
public function __construct() {
echo __CLASS__;
}
}
$obj = new Esempio(); // stampa Esempio
?>
__FUNCTION__
restituisce il nome della funzione corrente
<?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
<?php
namespace mioNameSpace;
echo "lo spazio di nomi è: " . __NAMESPACE__;
// o spazio di nomi è: mioNameSpace
?>
__construct()
e __destruct()
.__construct()
è il metodo magico che PHP invoca per creare istanze di oggetti di classe. Accetta qualsiasi numero di argomenti.
<?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
?>
__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.
<?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.
?>
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.
<?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
?>
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.