2010-08-31 12 views
17

Eine PHP-Closure- oder anonyme Funktion wird zum Erstellen einer Funktion ohne Angabe ihres Namens verwendet.Erstellen und Aufrufen einer anonymen Funktion in einer einzelnen Anweisung

Ist es möglich, sie ohne Zuordnung zum Bezeichner wie in JavaScript aufzurufen? z.B.

(function(){ 
    echo('anonymous function'); 
})(); 

Was ist die korrekte Verwendung von use Konstrukt bei der Definition anonyme Funktion und was ist der Status der anonymen Funktion in öffentlichen Verfahren mit Zugang zu privaten Eigenschaften?

$anon_func = 
function($my_param) use($this->object_property){ //use of $this is erroneous here 
    echo('anonymous function'); 
}; 
+4

Verschluss ist nicht ganz gleichbedeutend mit einem anonyme Funktion, obwohl anonyme Funktionen in PHP vom Typ 'Closure' sind. Nur damit du es weißt. – BoltClock

+0

Was ist der genaue Fehler, wenn Sie Ihr zweites Codebeispiel versuchen? "falsch" ist ein wenig unspezifisch. – BoltClock

+0

Kann $ nicht als lexikalische Variable verwenden –

Antwort

11

Ist es möglich, sie ohne zu nennen zuweisen, wie wir in JavaScript tun, um Identifier? z.B.

Nicht in PHP 5.x; es sei denn, Sie zählen es, wenn Ihre Methode einen Rückruf als Argument akzeptiert. zB:

$square = array_map(function ($v) { return $v*$v; }, $array); 

Was die korrekte Verwendung von Verwendung Konstrukt ist bei der Definition anonym Funktion

Das use Schlüsselwort gibt an, welche Variablen aus dem aktuellen lexikalischen Gültigkeitsbereich in den Verschluss eingeführt werden sollten. Sie können sie sogar als Verweis übergeben und die Variablen übergeben werden ändern, zB:

$total = 0; 
array_walk($array, function ($v) use (&$total) { $total += $v; }); 
// $total is now the sum of elements in $array 

was ist der Status der anonymen Funktion in öffentlichen Verfahren mit Zugang zu privaten Eigenschaften?

Verschlüsse innerhalb einer Klasse definiert haben vollen Zugriff auf alle seine Eigenschaften und Methoden, auch private, ohne dass $this durch das Schlüsselwort use in PHP 5.4 importieren:

// this works fine in PHP 5.4 
$anon_func = 
function($my_param) { 
    $thing = $my_param + $this->object_property; 
    echo('anonymous function'); 
}; 

Beachten Sie, dass aus irgendeinem seltsamen Grund Unterstützung für $this in Verschlüsse was removed in PHP 5.3. In dieser Version können Sie diese Einschränkung umgehen, mit so etwas wie:

// a workaround for PHP 5.3 
$temp = $this; 

$anon_func = 
function($my_param) use ($temp) { 
    $thing = $my_param + $temp->object_property; 
    echo('anonymous function'); 
}; 

Aber das gibt Ihnen die öffentliche Mitglieder versuchen, nur zugreifen, werden Sie private Mitglieder zugreifen noch einen Fehler geben.

Beachten Sie außerdem, dass der Versuch, unabhängig von der PHP-Version $this (über use) zu importieren, zu einem schwerwiegenden Fehler Cannot use $this as lexical variable führt.

+3

+1 Es ist nicht möglich, anonyme Funktionen wie '(function() {})() selbst aufzurufen;' in PHP, wahrscheinlich aus den gleichen Gründen, Array-Dereferenzierung ist noch nicht machbar, wie Marc B bemerkt. – BoltClock

+0

@BoltClock BTW Array dereferencing (zB: 'function foo() {return $ someArray;}', '$ var = foo() ['bar']') funktioniert auch in PHP 5.4 – NullUserException

3

Sieht nicht, da sie nach wie vor mit der function() {} Notation, und auf meinem 5.3.2 installieren, versuchen, Ihre Probe Begriff gibt einen unexpected '(' Syntaxfehler deklariert werden müssen. Die doc page auf Verschlüsse erwähnt es auch nicht.

Vielleicht wird es möglich, sobald sie den Parser patch, um somefunction()[2] Array-Dereferenzierung zu ermöglichen.

+1

Die Array-Dereferenzierung wurde zu [PHP 5.4] (http://www.php.net/manual/en/migration54.new-features.php) hinzugefügt, aber Sie können anonyme Funktionen nicht gleich nach deren Aufruf aufrufen Erklärung. – NullUserException

19
call_user_func(function() use(closure-vars){ ... }); 
+0

Wie würde das OP Klasseneigenschaften machen? Zugänglich für die Schließung? –

+0

Das op könnte eine Referenz des Objekts erstellen, das durch die use-Anweisung an den Abschluss übergeben wird, dh: $ obj = $ this; call_user_func (function() benutze ($ obj) {}). Auf diese Weise hat er Zugriff auf Klasseneigenschaften und Methoden innerhalb des Closings. Etwas von einem Hack, aber es ist das Beste, was wir haben, bis PHP 5.4 ankommt. – Jeremy

15

PHP 7 hinzugefügt, um die Fähigkeit, dies zu tun.

Dieser Code:

(function() { echo "This works as expected in PHP 7.\n"; })(); 

funktioniert wie ein in PHP erwartet 7. (es funktioniert immer noch nicht in jedem PHP 5.x release)

+0

Tolle Funktion. –

Verwandte Themen