Wie erhalte ich eine Eigenschaft in einem PHP basierend auf einer Zeichenfolge? Ich werde es nennen magic
. Also was ist magic
?
$obj->Name = 'something';
$get = $obj->Name;
wäre wie...
magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');
php
string
oop
properties
Daniel A. White
quelle
quelle
ArrayAccess
,Countable
und einer der Iterator - Schnittstellen, ist es meist nicht von einem normalenarray()
Wenn Sie auf die Eigenschaft zugreifen möchten, ohne eine Zwischenvariable zu erstellen, verwenden Sie die
{}
Notation:Auf diese Weise können Sie den Eigenschaftsnamen auch in einer Schleife erstellen, zum Beispiel:
quelle
$this->{$property}[$name]
, andernfalls$this->$property[$name]
wird ein Fehler$this->$property[$name]
tatsächlich gelingt, obwohl dies wahrscheinlich ein Fehler ist.$name
wird stillschweigend in eine ganze Zahl umgewandelt. Im Fall einer nicht numerischen Zeichenfolge ist dies0
. Dann ist dieser String - Index des Wertes$property
wird als Eigenschaftsnamen verwendet. Wenn$property
der Wert "abc" enthalten ist, bezieht sich dies auf die Eigenschaft$this->a
(Index 0). Wenn es eine solche Eigenschaft gibt, ist dies erfolgreich.Was Sie fragen, heißt Variable Variablen . Alles, was Sie tun müssen, ist, Ihre Zeichenfolge in einer Variablen zu speichern und wie folgt darauf zuzugreifen:
quelle
Etwas wie das? Ich habe es nicht getestet, sollte aber gut funktionieren.
quelle
Speichern Sie einfach den Eigenschaftsnamen in einer Variablen und verwenden Sie die Variable, um auf die Eigenschaft zuzugreifen. So was:
quelle
Möglicherweise gibt es Antworten auf diese Frage, aber Sie möchten möglicherweise diese Migrationen zu PHP 7 sehen
Quelle: php.net
quelle
Es ist einfach, $ obj -> {$ obj-> Name} die geschweiften Klammern umschließen die Eigenschaft ähnlich einer variablen Variablen.
Dies war eine Top-Suche. Aber meine Frage, die $ this verwendete, wurde nicht gelöst. In meinem Fall half auch die Verwendung der geschweiften Klammer ...
Beispiel mit Code Igniter get Instanz
in einer Quellbibliotheksklasse, die mit einer übergeordneten Klasseninstanz aufgerufen wird
Die Bibliotheksklasse muss auch mit der übergeordneten Instanz aus einer anderen Klasse stammen
quelle
Nur als Ergänzung: Auf diese Weise können Sie auf Eigenschaften mit Namen zugreifen, die sonst unbrauchbar wären
(nicht das du solltest, aber falls du musst).Wenn Sie noch schickere Sachen machen wollen, sollten Sie sich mit Reflexion befassen
quelle
Für den Fall, dass jemand anderes eine tiefe Eigenschaft unbekannter Tiefe finden möchte, habe ich mir das Folgende ausgedacht, ohne alle bekannten Eigenschaften aller Kinder durchlaufen zu müssen.
Zum Beispiel, um $ Foo-> Bar-> baz oder $ Foo-> baz oder $ Foo-> Bar-> Baz-> dave zu finden, wobei $ path eine Zeichenfolge wie 'foo / bar / baz' ist.
Und dann mit so etwas anrufen wie:
quelle
Hier ist mein Versuch. Es sind einige allgemeine Dummheitsprüfungen integriert, die sicherstellen, dass Sie nicht versuchen, ein Mitglied zu setzen oder zu bekommen, das nicht verfügbar ist.
Sie können diese 'property_exists'-Prüfungen auf __set bzw. __get verschieben und sie direkt in magic () aufrufen.
quelle
Diese Funktion prüft, ob die Eigenschaft für diese Klasse eines Kindes vorhanden ist, und erhält in diesem Fall den Wert, andernfalls wird null zurückgegeben. Jetzt sind die Eigenschaften optional und dynamisch.
Verwendung:
quelle
warum bearbeiten: vorher: mit eval (böse) nachher: überhaupt kein eval. in dieser Sprache alt sein.
quelle