Programmatische Suche nach öffentlichen Eigenschaften einer Klasse aus einer ihrer Methoden heraus

8

Ich habe eine Klasse Foo mit öffentlichen und geschützten Eigenschaften. Foo benötigt eine nicht-statische Methode, getPublicVars() , die eine Liste aller öffentlichen Eigenschaften von Foo zurückgibt (dies ist nur ein Beispiel, ich weiß von außerhalb die Foo Objekt aufrufen get_object_vars() wird dies erreichen und es gibt keine Notwendigkeit für meine getPublicVars() Methode).

  

Hinweis: Dies muss auch dynamisch deklarierte Eigenschaften zurückgeben, die zur Laufzeit der Klasseninstanz (Objekt) zugewiesen wurden, die nicht in der Klassendefinition definiert sind.

Hier ist das Beispiel:

%Vor%

Was ist der prägnanteste Weg, um nur die öffentlichen Eigenschaften eines Objekts aus den Methoden einer Klasse zu erhalten, in denen sowohl public als auch protected sichtbar sind?

Ich habe angeschaut:

Aber das scheint meine Frage nicht zu beantworten, da es darauf hinweist, get_object_vars() von außerhalb des Objekts zu verwenden.

    
Ray 29.10.2012, 14:55
quelle

3 Antworten

14

Wie Sie bereits festgestellt haben, ist der PHP-Build in get_object_vars auf den Bereich abgestimmt. Sie möchten nur die öffentlichen -Objekteigenschaften.

Also von dieser Funktion zur öffentlichen Variante ist kein großer Schritt:

%Vor%

Wenn Sie get_object_public_vars aufrufen, erhalten Sie nur die öffentlichen Eigenschaften, weil sie außerhalb des gültigen Bereichs liegen.

Wenn Sie eine feinere Kontrolle benötigen, können Sie auch das ReflectionObject :

verwenden %Vor%

Was den Vorteil hat, dass Sie keine andere Funktion im globalen Namespace einführen müssen.

    
hakre 29.10.2012, 15:00
quelle
14
  

Funktioniert nicht mit PHP-Version & gt; = 7
  Daher kann ich die Lösung nicht mehr wirklich empfehlen.
  Verwenden Sie stattdessen Reflektion

Um die öffentlichen Eigenschaften innerhalb der Klasse zu erhalten

%Vor%

Der "Trick" ist, dass get_object_vars aus dem Bereich von call_user_func aufgerufen wird und nicht der Bereich des Objekts

keine Notwendigkeit für Überlegungen, Stand-alone-Funktionen, Schließungen, etc.

    
Brad Kent 13.11.2014 17:10
quelle
-2

Nach diesem Artikel (geschrieben von Vance Lucas), können Sie einen neuen Aufrufbereich innerhalb Ihrer Klassifizierungsdefinition "Foo" mit einer Funktion " anonymous " erstellen und dann get_object_vars() von innen aufrufen. Auf diese Weise können Sie nur die öffentlichen Eigenschaften innerhalb Ihrer Klasse abrufen, auch wenn diese später dynamisch von außen erstellt wurden.

So angepasst an Ihr Beispiel wäre es:

%Vor%

und die Ausgabe wird sein:

%Vor%

Es gibt ein zweites Beispiel in dem oben erwähnten Artikel, das eine andere Möglichkeit zeigt, dasselbe mit den sogenannten "closures" (von PHP 5.3) zu machen, aber aus irgendeinem Grund funktioniert es nicht mit php v5.4 Die privaten und geschützten Eigenschaften bleiben also im resultierenden Array enthalten.

    
jumc 06.04.2013 04:36
quelle

Tags und Links