Klassenvariablen, die eine Funktion in PHP enthalten

8

PHP erlaubt Variablen Funktionen wie folgt zu halten:

%Vor%

Das funktioniert gut für mich. Ich versuche, eine Funktion in eine Klasse zu übergeben und eine Instanzvariable zu setzen, um diese Funktion zu halten, aber mit wenig Glück:

%Vor%

Mache ich hier etwas falsch? Der Fehler ist, dass die Funktion nicht existiert, so ist meine Vermutung zur Zeit, dass sie nach einer Klassenfunktion mit diesem Namen sucht (die es nicht gibt) und dann aufgibt, anstatt nach Variablen zu suchen ... wie kann ich macht es die $ this- & gt; distanceFunc als Variable anzeigen?

BEARBEITEN: Nach dem Rat aus den Antworten unten fand ich eine Lösung, die eine Funktion zum Umbruch des Aufrufs war. Zum Beispiel ist meine Klasse jetzt:

%Vor%

und das funktioniert großartig. PHP sucht zuerst nach Funktionen und kann nur sagen, ob es sich um eine Variable nach Kontext handelt. Ich denke, die Moral dieser Geschichte ist.

    
hackartist 08.08.2014, 21:52
quelle

6 Antworten

1

PHP hat keine erstklassigen Funktionen. Wenn Sie in JavaScript eine Funktion zurückgegeben haben, können Sie dies tun: myFunctionThatReturnsAFunction()(1,2) , aber nicht in PHP.

%Vor%     
Ryan McCullagh 08.08.2014, 22:12
quelle
3

Ihr Code funktioniert nicht, weil PHP $this->distanceFunc(1,7) als Klassenmethode interpretiert, aber Sie können Folgendes tun:

%Vor%

Ссылка

    
spacebiker 08.08.2014 22:13
quelle
3

In PHP belegen Methoden und Eigenschaften eines Objekts separate Namespaces. Dies unterscheidet sich beispielsweise von JavaScript, wo foo.bar = function() {} eine vollkommen gültige Methode zum Definieren einer Methode ist.

Folglich sucht $this->distanceFunc(1,7); nach einer Methode mit dem Namen distanceFunc für die aktuelle Klasse und die Klassen, von denen sie erbt, sucht aber nie nach der Eigenschaft , die Sie zufällig den gleichen Namen gegeben haben .

Eine Lösung besteht darin, PHP zu zwingen, eine Eigenschaft nachzuschlagen und sie dann auszuführen, z. $foo = $this->distanceFunc; $foo(1,7) oder call_user_func($this->distanceFunc, 1, 7)

Ein anderer wäre, die magische Methode __call für Ihre Klasse zu definieren, die immer dann ausgeführt wird, wenn auf eine nicht existierende Methode verwiesen wird. So etwas sollte funktionieren (ich habe jetzt keinen leichten Weg, um es zu testen):

%Vor%

Beachten Sie, dass dies immer noch nicht das Gleiche wie eine echte Methode ist, beispielsweise hinsichtlich des Zugriffs auf private Eigenschaften.

    
IMSoP 09.08.2014 00:09
quelle
2

Es sieht so aus, als ob Sie hier ein Strategie-Muster verfolgen. IE möchten Sie verschiedene Methoden zur Berechnung der Entfernung injizieren können? Wenn ja, gibt es einen "vernünftigeren" Weg, es zu tun.

Sie können eine Schnittstelle zu den Klassen definieren, die Sie zum Speichern der Strategie-Methode verwenden, um sicherzustellen, dass die Klasse immer die Methode calculate() zum Beispiel hat, was Ihre Distanzberechnungsfunktion wäre. Dann geben Sie im Konstruktor Ihrer Clusterer -Klasse eine Überprüfung der Schnittstelle im Parameter ein und rufen Sie calculate () für das übergebene Objekt auf.

Sieht so aus:

%Vor%

Da Sie eine Schnittstelle definiert haben, verfügt jedes übergebene Objekt über die Funktion calculate ()

    
pdizz 08.08.2014 22:13
quelle
1

Schauen Sie sich call_user_func

an %Vor%

Frag mich nicht, was der Unterschied ist, aber es funktioniert so, wie du es willst (Einer der Gründe, warum ich diese Sprache hasse)

    
Christian Gollhardt 08.08.2014 23:28
quelle
1

In HHVM können Sie dies tun:

%Vor%

Aber es ist noch nicht in PHP unterstützt. Aber wird in PHP 7 sein ( Es wird keine Veröffentlichung namens PHP 6 geben ).

    
Matthew 08.08.2014 23:38
quelle