compact()
sucht nach dem Variablennamen in der aktuellen Symboltabelle . $this
existiert dort nicht. Was erwartest du den Namen von $this
überhaupt?
Sie können:
%Vor% Ironischerweise kann man, sobald man $ zu $ the $ zugewiesen hat, $ auch mit 'this' statt 'that' verdichten. Siehe Ссылка . Aus Leistungsgründen werden $this
und Super-Globals nur dann gefüllt, wenn sie benötigt werden. Wenn sie nicht benötigt werden, existieren sie nicht.
Nach Update bearbeiten
Ihr compact($this->result);
sucht nach "etwas", das im Bereich local / current der Methode output()
definiert ist. Da es keine solche Variable gibt, ist das resultierende Array leer. Das würde funktionieren:
Sie sollten get_class_vars()
verwenden, das ein assoziatives Array aller Eigenschaften (Klassen-Vars) der angegebenen Klasse mit dem var-Namen als Schlüssel zurückgibt. Verwenden Sie get_class_vars( get_called_class() )
innerhalb der Klasse, um den Namen dieser Klasse als Zeichenfolge zu erhalten. get_class( $this )
funktioniert auch.
Natürlich erhalten Sie all die Eigenschaften der Klasse (unabhängig vom Modifikator der Zugriffskontrolle). Daher möchten Sie diese Liste wahrscheinlich auch filtern. Eine einfache (wenn auch etwas verschleierte) Möglichkeit, dies zu tun, ist array_intersect_key()
zusammen mit array_flip()
zu verwenden, wie in dieser SE Antwort . Die ganze Sache sieht so aus:
Sie müssen entscheiden, ob sich der resultierende Code wirklich lohnt. Es ist wahrscheinlich einfacher, array( 'var_1' => $this->var_1, 'var_2' => $this->var_2 );
als @ircmaxell zu lesen.
Allerdings, weil a) ich Yak Shaving und b) mag, weil ich ein sehr fleißiger lazy Programmierer und c) es gab wahrscheinlich einen Einzeiler in Perl, der das elegant machte, hier ist der Code im Zusammenhang mit dem Problem, das ich angehen wollte: Überschreiben eines Assoziatives Array (das ist auch eine Eigenschaft der aktuellen Klasse) mit einer Anzahl (aber nicht allen) anderer Eigenschaften derselben Klasse.
%Vor%Was die erwartete Ausgabe erzeugt:
%Vor%Beachten Sie, dass ich das in meinem eigenen Gebrauch nicht in zwei Zeilen aufgeteilt hätte, aber ich wollte den Code, der sich auf das OP bezieht, getrennt halten.
Sie müssen Indexfelder definieren. Etwas wie: $ array = kompakt ('this', 'variable')