Napisany sty-03-2010

introspekcja

Introspekcja to pojęcie oznaczające zdolność aplikacji do zarządzania własnym kodem. Pozwala zatem pobierać informacje na temat klas,interfejsów i funkcji w trakcie działania programu. Termin ten jest utożsamiany z mechanizmem refleksji. W zależności od języka programowania, oba pojęcia mogą się subtelnie różnić. Z reguły mechanizm odbić (reflection) rozszerza introspekcję, oferując znacznie większe spektrum możliwości (dostarczając bardziej szczegółowych informacji, czasami dając szansę na zmianę semantyki, czy też zachowania metod, funkcji itp.). Refleksja stanowi doskonałe narzędzie inżynierii odwrotnej i jest jedną z technik programowania generycznego.

Introspekcja w PHP

Po krótkim wstępie teoretycznym przechodzimy do praktycznego przykładu, wykorzystującego introspekcję. Na początku przykładowa klasa pełniąca rolę królika doświadczalnego.

class Rabbit {

	public $name;

	public function PrintClassName () {

		echo __CLASS__;

	}

	public function PrintRabbitName () {

		echo $this->name;

	}

}

Pobierzmy podstawowe informacje o tej klasie. Sposób pierwszy - na podstawie nazwy klasy:

var_dump (class_exists('Rabbit'));
var_dump (get_class_methods('Rabbit'));
var_dump (method_exists('Rabbit','PrintRabbitName'));
var_dump (property_exists('Rabbit','name'));

Sposób drugi - korzystając z instancji klasy:

$obj = new Rabbit();
var_dump (get_class_methods($obj));
var_dump (method_exists($obj,'PrintRabbitName'));
var_dump (property_exists($obj,'name'));

Omówmy użyte powyżej funkcje:

  • class_exists(string $name) - zwraca bool informując czy klasa została zdefiniowana czy też nie. UWAGA! Funkcja posiada opcjonalny parametr, o którym można przeczytać w dokumentacji.
  • get_class_methods(mixed $class) - zwraca array zawierającą wszystkie metody klasy przekazanej w parametrze (instancja lub jej nazwa). Jeśli wystąpił błąd funkcja zwróci NULL.
  • method_exists(mixed $class, string $method) - zwraca bool informując czy istnieje metoda $method dla klasy przekazanej w parametrze $class (instancja lub jej nazwa).
  • property_exists(mixed $class, string $property) - zwraca bool informując czy istnieje właściwość $property dla klasy przekazanej w parametrze $class (instancja lub jej nazwa).

Oczywiście to tylko wybrane funkcje. Zainteresowanych zapraszam TUTAJ. Źródło przykładu zamieszczonego w tym poście znajdziecie TUTAJ. O refleksji pisałem już trochę TUTAJ.

Tagi : , ,

Komentarze:

Napisz komentarz