Sichtbarkeit von Eigenschaften ermitteln

Da die letzten beiden „Immer wieder freitags“ Artikel aus Zeitmangel ausgefallen sind, heute mal ein kurzer, knackiger Beitrag über die Sichtbarkeiten von Objekteigenschaften und wie man diese ermitteln kann. Das Thema Eigenschaften und deren Sichtbarkeiten ist eigentlich recht schnell an einem praktischen Beispiel erklärt.

class MeinTest {
    public $meineErsteVariable = 'Var1';
    public $meineZweiteVariable = 'Var2';
    protected $eineProtectedVariable = 'Protected';
    private $einePrivateVariable = 'Private';
}

$meinTest = new MeinTest();
echo $meinTest->meineErsteVariable; // ergibt: Var1

Jede der Objekteigenschaften hat hier eine Sichtbarkeit, die entweder public, protected oder private ist. Soweit also ein alltäglicher Einblick einer ganz normalen Klasse, wie man sie hier und da mal sieht. Was passiert nun, wenn wir auf die öffentlichen (public) Eigenschaften einer Klasse zugreifen müssen, diese aber nicht kennen? Nicht möglich? Oh doch! Die Reflection API ab PHP5 bietet Methoden, um an die Eigenschaften von Objekten zu gelangen.
Für ein praktisches Beispiel erweitern wir unsere Klasse von gerade einfach mal um einen Konstruktor:

public function __construct() {
    $this->meineErsteVariable = 'Bla1';
    $reflector = new ReflectionClass($this);
    foreach ($reflector->getProperties(ReflectionProperty::IS_PUBLIC) as $prop) {
        echo $prop->getName() . " => " . $prop->getValue($this) . "
"; } }

Zunächst ändern wir einmal den Inhalt der Klassen-Eigenschaft „meineErsteVariable“ auf „Bla1“. Danach reflektieren wir in diesem Beispiel die initialisierte Klasse und holen uns mittels ReflectionClass:getProperties() alle Eigenschaften. Indem hier die Klassen-Konstante IS_PUBLIC übergeben wurde, werden nur alle öffentlich zugänglichen Eigenschaften ermittelt. Alle öffentlichen Eigenschaften werden dann in einer foreach()-Schleife ausgegeben.
Wie wendet man sowas praktisch an? Ich habe es bei einer Validierung von Eingabedaten im Woltlab Comunity Framework eingesetzt. Alle Eingabemöglichkeiten / Variablen sind als öffentliche Eigenschaften gesetzt und somit lassen sich alle Angaben auch entsprechend abfragen. Hier das praktische Anwendungsbeispiel:

protected function validate() {
    $reflection = new ReflectionClass($this);
    foreach ($reflection->getProperties(ReflectionProperty::IS_PUBLIC) as $prop) {
        try {
            if (!strlen($prop->getValue($this))) {
                throw new UserInputException($prop->getName(), 'empty');
            }
        } catch (UserInputException $e) {
            $this->errorType[$e->getField()] = $e->getType();
        }
    }
		
    if (count($this->errorType)) {
        die(json_encode($this->errorType));
    }

Was haltet ihr von der Reflection API und setzt ihr diese bereits und wenn ja, wo? Fragen über Fragen …

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.