nicht-statische closures

30/12/2014 - 01:54 von Stefan+Usenet | Report spam
Ich möchte in einer statischen Methode der Klasse A gerne eine
anonyme Funktion definieren, die (via bind) an ganz anderer Stelle
in einer ganz anderen Klasse nicht-statisch verwendet werden soll.
Das mag man gut finden oder auch nicht, jedenfalls aber klappt es
nicht ("Warning: Cannot bind an instance to a static closure
[...]"):

<?php

class A {
public static function aa() {
return function() { var_dump($this); };
}
}

$a = function() { var_dump($this); };

$c = Closure::bind($a, new A(), 'A');
$c();

$c = Closure::bind(A::aa(), new A(), 'A');
$c();

?>

Dass die anonyme Funktion den (statischen) Kontext ihrer
Elternmethode erbt, könnte ich ja eventuell noch verstehen. Aber
warum um alles in der Welt funktioniert das dann mit Funktionen,
die ohne jeden Objekt-Kontext erzeugt werden? Das ist ja von einem
àsthetischen Standpunkt aus betrachtet auch nicht besser.

Oder gibt es eine Möglichkeit, das zu tun, was ich tun möchte
(nàmlich beide Funktionen nicht-statisch verwenden zu können), und
ich stelle mich nur zu blöd dafür an?

Servus,
Stefan

http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan - Welch eine Lust!
(Sloganizer)
 

Lesen sie die antworten

#1 Stefan+Usenet
30/12/2014 - 13:30 | Warnen spam
On Tue, 30 Dec 2014 01:54:00 Stefan Froehlich wrote:
<?php

class A {
public static function aa() {
return function() { var_dump($this); };
}
}

$c = Closure::bind(A::aa(), new A(), 'A');
$c();

?>



[...]

Oder gibt es eine Möglichkeit, das zu tun, was ich tun möchte
(nàmlich beide Funktionen nicht-statisch verwenden zu können), und
ich stelle mich nur zu blöd dafür an?



So, wie es aussieht, làsst sich das wohl nicht machen (weshalb eine
im globalen Namespace deklarierte Closure an beliebige Objekte
beliebiger Klassen gebunden werden kann, eine innerhalb einer
statischen Methode deklarierte Closure jedoch an gar nichts, muss
mir erst noch jemand logisch erklàren; klingt ein wenig nach "damals
beim Implementieren zu kurz gedacht").

Für den Moment behelfe ich mir mit:

<?php

class A {
public static function aa() {
return function(self $a) { var_dump($a); };
}
}

A::aa(new A());

?>



Sieht zwar nicht ganz so schön aus, kommt dem Original aber noch am
nàchsten und funktioniert so, wie es soll.

Servus,
Stefan

http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan. Lieb und klein!
(Sloganizer)

Ähnliche fragen