32. Overload di __isset() e __unset()


Prototipi di __isset() e __unset()

bool __isset (string name)
void __unset (string name)

Effettuando un overloading su questi due metodi magici, abbiamo la possibilità di controllare quando vengono effettuate delle chiamate alle funzioni isset() e unset() (descritte qui) su un attributo della classe.

Anche in questo caso, le chiamate vengono effettuate solo per attributi non accessibili o non dichiarati.

Il metodo __isset() viene richiamato anche per l'overload su empty() :

<?php

	class Oggetto
	{
		private $privato;
		public $pubblico;

		public function __isset($attributo)
		{
			echo "<br />Chiamata a __isset() da \"$attributo\" = ";

			switch ($attributo)
			{
				case "privato" :
					return isset($this->privato);
					break;

				case "pubblico" :
					return isset($this->pubblico);
					break;

				default :
					throw new Exception("Attributo non esistente");
					break;
			}
		}

		public function __unset($attributo)
		{
			echo "<br />Chiamata a __unset() da \"$attributo\"";
			unset($attributo);
		}
	}

	try
	{
		$obj = new Oggetto();

		echo (int) isset($obj->pubblico);
		echo (int) isset($obj->privato);
		echo (int) empty($obj->privato);

		unset($obj->bho);
		echo (int) isset($obj->nonesisto);
	}
	catch (Exception $e)
	{ echo $e->getMessage(); }

?>

Il codice produce il seguente risultato :

0
Chiamata a __isset() da "privato" = 0
Chiamata a __isset() da "privato" = 1
Chiamata a __unset() da "bho"
Chiamata a __isset() da "nonesisto" = Attributo non esistente

Analizziamo il codice nel blocco try :

  • Prima echo : non provoca chiamate al metodo magico __isset() ma direttamente alla funzione standard isset() perchè l'attributo Oggetto->pubblico è accessibile (public)
  • Seconda echo : provoca una chiamata a __isset() che ritorna false da isset($this->privato); poichè $privato non è stato inizializzato
  • Terza echo : provoca una chiamata a __isset() che ritorna true perchè $privato non è stato inizializzato (quindi è vuoto)
  • unset() : provoca una chiamata a __unset() che stampa ("Chiamata a __unset() da "bho"")
  • Quarta echo : provoca una chiamata a __isset() che solleva un'eccezione ("Attributo non esistente")

Nota : nelle echo viene effettuato il casting esplicito al tipo int, perchè se echo riceve il valore booleano false non stampa nulla.

Inoltre fate attenzione alla versione di PHP che utilizzate perchè l'overloading di queste funzioni è disponibile solo da PHP 5.1.0