Ich versuche, mit php5.3 und Schließung zu spielen.Definieren Sie eine Schließung als Methode aus der Klasse
Ich sehe hier (Listing 7. Schließung in einem Objekt: http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html), dass es möglich ist, $ dies in der Callback-Funktion zu verwenden, aber es ist nicht. Also versuche ich $ dies als Nutzung variabel zu geben:
$self = $this;
$foo = function() use($self) { //do something with $self }
So das gleiche Beispiel zu verwenden:
class Dog
{
private $_name;
protected $_color;
public function __construct($name, $color)
{
$this->_name = $name;
$this->_color = $color;
}
public function greet($greeting)
{
$self = $this;
return function() use ($greeting, $self) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
};
}
}
$dog = new Dog("Rover","red");
$dog->greet("Hello");
Output:
Hello, I am a red dog named Rover.
Zu allererst diesem Beispiel nicht die Zeichenfolge nicht gedruckt, aber die Funktion zurück, aber das ist nicht mein Problem.
Zweitens kann ich nicht auf private oder geschützt zugreifen, da die Callback-Funktion eine globale Funktion und nicht im Kontext von dem Hund Objekt ist. Das ist mein Problem. Es ist das gleiche wie:
function greet($greeting, $object) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
}
Und ich will:
public function greet($greeting) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
}
die sich von Hund und nicht global ist.
Nein, ich habe nicht verstanden, was Sie wollen. Wenn "greet" eine Methode ist, wird die Sichtbarkeit auf "public" festgelegt, sodass Ihre beiden letzten Codebausteine gleichwertig sind. – Artefacto
Die magische Injektion von '$ this' in einem Clojure wurde fallen gelassen, bevor PHP 5.3 veröffentlicht wurde. Eigentlich wurde es für eine kommende Version von PHP verschoben. Es wird etwas wie 'Closure :: bindTo' geben, mit dem Objekte als Kontexte an Lambdas gebunden werden können. –