$ dieses Schlüsselwort und kompakte Funktion

8

Warum funktioniert compact(array($this, 'variable') nicht? Ich habe nichts darüber gefunden.

AKTUALISIEREN

%Vor%

Ich habe im Moment nur eine Lösung gefunden:

%Vor%

Aber das ist hässlich.

    
Buddy 14.02.2011, 16:42
quelle

5 Antworten

8

Kurze Antwort: Verwenden Sie nicht compact() . In dieser Situation ist es sinnlos (in den meisten Situationen ist es sinnlos, aber das ist eine andere Geschichte). Was ist falsch daran, nur ein Array zurückzugeben?

%Vor%     
ircmaxell 14.02.2011, 17:16
quelle
7

Ich weiß, das ist alt, aber ich wollte so etwas für ein Projekt, an dem ich gerade arbeite. Ich dachte, ich würde die Lösung teilen, die mir einfiel:

%Vor%

Es skaliert ziemlich gut. Zum Beispiel:

%Vor%

Seien Sie vorsichtig.

    
Stoney 15.05.2015 18:26
quelle
6

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:

%Vor%     
Gordon 14.02.2011 16:51
quelle
3

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:

%Vor%

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.

    
Tom Auger 23.07.2013 15:40
quelle
0

Sie müssen Indexfelder definieren. Etwas wie: $ array = kompakt ('this', 'variable')

Ссылка

    
Mano Kovacs 14.02.2011 16:46
quelle

Tags und Links