Können Sie Instanzeneigenschaften dynamisch in PHP erstellen?
Gibt es eine Möglichkeit zu schaffen, alle Instanz-Eigenschaften dynamisch? Zum Beispiel, ich möchte in der Lage sein zu generieren, werden alle Attribute im Konstruktor und noch in der Lage sein, um Ihnen den Zugang nach der Klasse instanziiert wird, wie diese: $object->property
. Beachten Sie, dass ich für den Zugriff auf die Eigenschaften separat, und nicht mit einem array; hier ein Beispiel von dem, was ich nicht wollen:
class Thing {
public $properties;
function __construct(array $props=array()) {
$this->properties = $props;
}
}
$foo = new Thing(array('bar' => 'baz');
# I don't want to have to do this:
$foo->properties['bar'];
# I want to do this:
//$foo->bar;
Um genauer zu sein, wenn ich den Umgang mit Klassen, die eine große Anzahl von Eigenschaften, ich würde gerne in der Lage, wählen Sie alle Spalten in einer Datenbank (das sind die "Eigenschaften") und erstellen Sie eine Instanz Eigenschaften von Ihnen. Jeder Spaltenwert gespeichert werden soll, in einer separaten Instanz-Eigenschaft.
InformationsquelleAutor der Frage Brayn | 2009-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Art. Es sind Magische Methoden, mit denen Sie Haken Sie Ihren eigenen code für die Umsetzung Klasse Verhalten zur Laufzeit:
Dies ist ein Beispiel für die dynamische getter-und setter-Methoden, es ermöglicht die Ausführung von Verhalten, wenn eine Objekt-Eigenschaft zugegriffen wird. Zum Beispiel
drucken würde, in diesem Fall "dynamischer!" und Sie können auch einen Wert zuweisen, um eine beliebig benannte Eigenschaft, in dem Fall die __set () - Methode wird automatisch aufgerufen. Die __call($name, $params) - Methode macht das gleiche für die Objekt-Methode aufruft. Sehr nützlich in besonderen Fällen. Aber die meisten der Zeit, erhalten Sie, indem Sie mit:
...weil meistens alles, was Sie brauchen, ist, um dump-den Inhalt eines Arrays in entsprechend benannte Klasse Felder einmal, oder zumindest sehr explizite Punkte in der Ausführung Weg. Also, wenn Sie wirklich brauchen, das dynamische Verhalten, verwenden das Letzte Beispiel, füllen Sie Ihre Objekte mit Daten.
InformationsquelleAutor der Antwort Udo
Es hängt davon ab, was genau Sie wollen. Können Sie ändern die Klasse dynamisch? Nicht wirklich. Aber können Sie erstellen Objekt Eigenschaften dynamisch, wie in einer konkreten Instanz der Klasse? Ja.
Ausgänge:
So eine Objekt-Eigenschaft mit dem Namen "bar" geschaffen wurde, dynamisch in den Konstruktor.
InformationsquelleAutor der Antwort Chad Birch
Ja, Sie können.
Ausgabe
Dieser code wird gesetzt dynamischen Eigenschaften im Konstruktor, die dann zugegriffen werden, mit $this->Spalte. Es ist auch eine gute übung zur Verwendung der __get und __set magic-Methoden im Umgang mit Eigenschaften, die nicht definiert sind, die innerhalb der Klasse. Mehr Informationen finden Sie hier.
http://www.tuxradar.com/practicalphp/6/14/2
http://www.tuxradar.com/practicalphp/6/14/3
InformationsquelleAutor der Antwort The Pixel Developer
Können Sie über eine Instanz-variable zu handeln als ein Platzhalter für beliebige Werte, und verwenden Sie dann die __get magic-Methode abrufen, die Sie als reguläre Eigenschaften:
InformationsquelleAutor der Antwort Carlton Gibson
Warum ist alle so kompliziert?
InformationsquelleAutor der Antwort srcspider
Hier ist einfache Funktion zum Auffüllen Objekt-member, ohne dass die Schüler der öffentlichkeit.
Es hinterlässt auch Konstruktor für Ihre eigenen Nutzung, die Schaffung neuer Instanz-Objekt ohne Konstruktor aufrufen! So, Ihr domain-Objekts hängt nicht von der Datenbank!
P. S. das Abrufen von Daten aus dem Objekt ähnlich ist, z.B. $reflProp->setValue($entity, $Wert);
P. P. S. Diese Funktion ist stark inspiriert von Doctrine2 ORM, die ist genial!
InformationsquelleAutor der Antwort Serg
InformationsquelleAutor der Antwort Anthony
Können Sie:
Würde, setzen Sie das Attribut
foo
des Objekts, es heißt aufbar
.Können Sie auch Funktionen verwenden:
Dies würde auch set
foo
(nichtFOO
)bar
.InformationsquelleAutor der Antwort Koraktor
Erweitern stdClass.
Ich hoffe das ist das, was Sie brauchen.
InformationsquelleAutor der Antwort Anthony
Dies ist wirklich kompliziert zu handhaben für diese rasante Entwicklung. Ich mag Antworten und Magische Methoden, aber meiner Meinung nach es besser ist die Verwendung von code-Generatoren wie CodeSmith.
Habe ich gemacht-Vorlage, die an eine Datenbank anschließen, Lesen Sie alle Spalten und deren Datentypen und erzeugen ganze Klasse entsprechend.
Diese Weise habe ich fehlerfrei (kein Tippfehler) lesbaren code. Und wenn dein Datenbank-Modell änderungen laufen generator wieder... es funktioniert für mich.
InformationsquelleAutor der Antwort zidane
Wenn Sie wirklich müssen es tun, der beste Weg ist, um eine überlastung ein ArrayObject ist, die es erlaubt zu pflegen iteration Unterstützung (foreach), das wird noch eine Schleife durch alle Ihre Eigenschaften.
Ich beachten Sie, dass Sie sagte: "ohne ein array verwenden", und ich möchte Ihnen versichern, dass während technisch ein array verwendet wird, in den hintergrund, die Sie NIE HABEN, um ES ZU SEHEN. Haben Sie Zugriff auf alle Eigenschaften über ->properyname oder foreach ($class in $Namen => $Wert).
Hier ist ein Beispiel, an dem ich arbeitete gestern, Hinweis: dies ist auch STARK TYPISIERT. Also Eigenschaften, die markiert sind, "integer" wirft einen Fehler, wenn Sie versuchen, und geben Sie einen "string".
Können Sie entfernen, natürlich.
Gibt es auch eine AddProperty () - member-Funktion, obwohl es nicht in dem Beispiel demonstriert. Das wird Ihnen erlauben, um Eigenschaften hinzuzufügen später.
Beispiel für die Nutzung:
InformationsquelleAutor der Antwort Orwellophile
Nach dem Lesen @Udo 's Antwort. Ich habe das folgende Muster, das nicht aufblasen eine Instanz der Klasse mit was auch immer Elemente, die in Ihrem Konstruktor die array-argument, aber immer noch lassen Sie weniger Tippen und einfach fügen Sie neue Eigenschaften der Klasse.
Dann können Sie das übergeben von arrays wie:
InformationsquelleAutor der Antwort