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.
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
:
Was den Vorteil hat, dass Sie keine andere Funktion im globalen Namespace einführen müssen.
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.
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.
Tags und Links php reflection oop