Napisany lut-22-2009

wstęp do mechanizmu refleksji w PHP

W PHP 5 pojawił się rozbudowany Reflection API, który umożliwia uzyskiwanie szczegółowych informacji na temat klas (ich właściwości oraz metod), funkcji i interfejsów. Dzięki niemu możemy na przykład, utworzyć system wtyczek dla naszej aplikacji. Zobaczmy więc z czego się ów API składa:

  • class Reflection { }
  • interface Reflector { }
  • class ReflectionException extends Exception { }
  • class ReflectionFunction extends ReflectionFunctionAbstract implements Reflector { }
  • class ReflectionParameter implements Reflector { }
  • class ReflectionMethod extends ReflectionFunctionAbstract implements Reflector { }
  • class ReflectionClass implements Reflector { }
  • class ReflectionObject extends ReflectionClass { }
  • class ReflectionProperty implements Reflector { }
  • class ReflectionExtension implements Reflector { }

Aby zrozumieć zagadnienie proponuje od razu przejść do praktyki. Swoją uwagę skupimy wyłącznie na ReflectionClass.

ReflectionClass

Na początek napiszemy kod klasy Proba, która posłuży nam za swego rodzaju “królika doświadczalnego”. Niech zawiera pare metod i właściwości. Spójrzmy:

class Proba {

	public $first;
	private $second = 12;
	protected $third;

	public function GetFirst () {
		return $this->GetSecond ();
	}

	private function GetSecond () {

		return $this->second;

	}

	public function GetEcho () {

		echo 'PROBA';

	}

}

Najwyższa pora na użycie ReflectionClass. Aby skorzystać z możliwości które nam oferuje, tworzymy jego instancję, a w parametrze konstruktora przekazujemy nazwę klasy, którą chcemy rozebrać na czynniki pierwsze:

$class = new ReflectionClass('Proba');

Teraz sprawdźmy jakie informacje uzyskamy dzięki metodom omawianej klasy:

var_dump($class->isInternal());
var_dump($class->isUserDefined());
var_dump($class->isInstantiable());
var_dump($class->hasMethod('GetFirst')); //dodano w PHP 5.1
var_dump($class->hasProperty('first')); //dodano w PHP 5.1
var_dump($class->getStartLine());
var_dump($class->implementsInterface('Serializable'));
var_dump($class->isAbstract());

Omówmy ich działanie dokładniej. Zatem:

  • isInternal() - zwraca bool informując czy klasa jest wbudowana
  • isUserDefined() - zwraca bool informując czy klasa jest zdefiniowana przez użytkownika
  • isInstantiable() - zwraca bool informując czy można utworzyć obiekt klasy
  • hasMethod($methodname) - zwraca bool informując czy klasa zawiera metodę podaną w parametrze
  • hasProperty($propertyname) - zwraca bool informując czy klasa zawiera właściwość podaną w parametrze
  • getStartLine() - zwraca int informując w której linii rozpoczyna się definicja klasy
  • implementsInterface($interfacename) - zwraca bool informując czy dana klasa implementuje interfejs podany w parametrze
  • isAbstract() - zwraca bool informując czy dana klasa jest abstrakcyjna

To tylko wybrane metody ReflectionClass. Zainteresowanych zapraszam do zapoznania się z dokumentacją, oraz pozostałymi składnikami Reflection API - TUTAJ. Żródła znajdziecie TUTAJ

Tagi : ,

Komentarze:

Napisz komentarz