Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 22 di 50
  • livello avanzato
Indice lezioni

Reflection in PHP

Come utilizzare le funzioni di Reflection in PHP, uno strumento molto potente in grado di esaminare le caratteristiche e le funzionalità di un oggetto estraendo informazioni da esso.
Come utilizzare le funzioni di Reflection in PHP, uno strumento molto potente in grado di esaminare le caratteristiche e le funzionalità di un oggetto estraendo informazioni da esso.
Link copiato negli appunti

Nella precedente lezione abbiamo analizzato l'utilizzo di alcune delle funzioni di introspezione in PHP.
In questa lezione parleremo di Reflection in PHP, ovvero una metodologia con la quale chiedere ad un oggetto
delle informazioni riguardanti i suoi metodi ed i suoi attributi.

PHP, supporta la riflessione mediante l'API Reflection, la quale mette a disposizione un gran numero
di metodi e di classi, utili alla Reflection.

PHP, a partire dalla versione 5, fornisce la classe ReflectionClass, con cui effettuare operazioni
di riflessione su classi, metodi e interfacce e per estrarre le informazioni su tutti i componenti di una classe.

Esempio pratico di Reflection in PHP

In questo esempio utilizzeremo le stesse dichiarazioni delle classi Sample e Student
e dell'interfaccia Person impiegate nel precedente capitolo:

<?php
			// dichiarazione della classe Introspezione
			class Introspezione
			{
				// metodi
				public function note() {
					echo "Superclasse della classe Sample<br />";
				}
			}
			// definizione della sottoclasse Sample
			class Sample extends Introspezione
			{
				public function note() {
					echo "Classe: ".get_class($this),"<br />";
					echo "Classe di derivazione: ".get_parent_class($this), "<br />";
				}
			}
			interface Person {
				// costanti
				const COSTANTE = "valore";
				// definizione dei metodi
				public function getName();
				public function setName($name, $lastname);
			}
			class Student implements Person {
				public $name = "";
				public $lastname = "";
				// implementazione dei metodi
				public function getName(){
					// corpo del Metodo
					echo "$this->name $this->lastname";
				}
				public function setName($name, $lastname){
					// corpo del Metodo
					$this->name = $name;
					$this->lastname = $lastname;
				}
			}
			// istanziamo la ReflectionClass, passando come parametro nel costruttore il nome della classe.
			$sample = new ReflectionClass("Sample");
			// restituisce il nome della classe genitore di un oggetto o di una classe
			$parent = $sample->getParentClass();
			echo $sample->getName() . " è una sottoclasse di " . $parent->getName() . "<br />";
			$reflection = new ReflectionClass("Student");
			$interfaceNames = $reflection->getInterfaceNames();
			if (in_array("Person", $interfaceNames)) {
				echo "<br />Student implements Person<br />";
			}
			// ReflectionClass::getMethods - i metodi relativi a quella classe
			$methods = $reflection->getMethods();
			echo "<br />Sono disponibili i seguenti metodi:<br />";
			print_r($methods);
			// ReflectionClass::getConstants - array associativo contenente i nomi e i valori delle costanti
			$constants = $reflection->getConstants();
			echo "<br /><br />Sono disponibili le seguenti costanti:<br />";
			foreach ( $constants as $name => $value ) {
				echo $name . '=>' . $value . PHP_EOL;
			}
			// ReflectionClass::hasMethod - (Controllo se un metodo è definito in una classe)
			if ($reflection->hasMethod("setName")) {
				echo "<br /><br />Il metodo setName() esiste per Student";
			}	
	?>

L'output HTML generato dal codice sarà il seguente:

Sample è una sottoclasse di Introspezione <br />
		Student implements Person<br />
		Sono disponibili i seguenti metodi:<br />
		Array ( [0] => ReflectionMethod Object ( [name] => getName [class] => Student ) [1] => ReflectionMethod Object ( [name] => setName [class] => Student ) )
		<br /><br />
		Sono disponibili le seguenti costanti:<br />
		COSTANTE=>valore
		<br /><br />
		Il metodo setName() esiste per Student

Nell'esempio precedente, abbiamo poi istanziato la ReflectionClass, passando come parametro nel costruttore
il nome della classe. Poi, abbiamo richiamato i metodi (alcuni dei tanti a disposizione) relativi alla classe ReflectionClass.

Il metodo getInterfaceNames() restituisce un array con il nome dell'interfaccia
che implementa la classe. Per visualizzare il nome dell'oggetto ReflectionClass si utilizza, come visto nel precedente capitolo,
il metodo GetName(). Il metodo getMethods() restituisce un array di oggetti di tipo ReflectionMethod e
un parametro (opzionale) per filtrare i risultati in base a metodi con determinati attributi:
ReflectionMethod::IS_STATIC, IS_PUBLIC, IS_PROTECTED, IS_PRIVATE, IS_ABSTRACT, e IS_FINAL.

Infine, il metodo getConstants, resituisce un array associativo contenente i nomi e i valori delle costanti.


Ti consigliamo anche