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

<?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

?>
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.
<?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.
<?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.
<?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.
Similari
Overloading di metodi in Java
13% Java
Un metodo overload viene utilizzato per riutilizzare il nome di un metodo ma con argomenti diversi, opzionalmente con un differente tipo di ritorno. [expand title=”Regole per overload” startwrap=”” endwrap=”” excerpt=”⤽” s…
Iteratori in PHP
9% Php
Iterator è uno dei più noti modelli di progettazione grazie al suo utilizzo in diversi linguaggi di programmazione come Python, Java, C++ e PHP. Fondamentalmente ciò che questo modello propone è di trasferire la responsabi…
Restrizioni per caricare un file con PHP
8% Php
Dalle foto di famiglia ai documenti aziendali, file uploads potenzia molte delle applicazioni web più importanti. [expand title=”L’oggetto $_FILES” startwrap=”” endwrap=”” excerpt=”⤽” swapexcerpt=”” expanded=”true” trigcla…
OOPjs: Oggetti, incapsulamento e astrazione
8% JScript
Un post veloce per quanto riguarda i concetti più importanti e frequenti dello JavaScript avanzato o che possiamo dire Object Oriented Programming JavaScript. Gli oggetti sono dei concetti chiave di JavaScript. Iniziamo ra…
Problemi con il BOM dell’UTF8
7% Php
Diventa un rompicapo, se si ha il BOM UTF8 all’inizio del file PHP, XML o javascript. Questi files devono inviare la loro intestazione prima di ogni altra cosa. A causa della posizione del BOM, che sono i primi bytes del f…