2010-03-09 1 views

Antwort

33

Ich glaube nicht, dass dies möglich ist, mit PHP 5.2 ...

Mit PHP 5.3, obwohl, könnte man wahrscheinlich eine Schließung verwenden, das zu tun nur ...


Edit: dauerte einige Zeit, um die Syntax zu erinnern, aber hier ist, wie es aussehen würde:

function foo() 
{ 
    $l = "xyz"; 
    $bar = function() use ($l) 
    { 
     var_dump($l); 
    }; 
    $bar(); 
} 
foo(); 

Und, das Skript ausgeführt wird, dann würden Sie erhalten:

$ php temp.php 
string(3) "xyz" 


Ein paar Anmerkung:

  • Sie eine ; nach der Funktion der Erklärung setzen müssen!
  • Sie könnten die Variable Bezug genommen wird, mit einem &use vor seinem Name: use (& $l)

Für weitere Informationen, als Referenz, können Sie einen Blick auf dieser Seite im Handbuch nehmen: Anonymous functions

+0

Warum verwenden Sie überhaupt verschachtelte Funktionen? –

+0

Wer weiß ^^ Das war nicht die Frage ^^ ;; mit PHP 5.3 und anonymen Funktionen kann es für Closures ziemlich nützlich sein ;;; Vor PHP 5.3 ... habe ich noch nie eine verschachtelte Funktion mit PHP <5.3 verwendet. –

+2

@PascalMARTIN Wichtig, geschachtelte Funktionen vor PHP 5.3 _do nicht exists_. Obwohl sie aussehen, als wären sie lokal deklariert, enden sie im globalen Rahmen. Ich denke, das gleiche gilt jetzt, weshalb Sie anonyme Funktionen verwenden müssen, um jede Art von Verschachtelung zu erreichen. – Izkata

4

In PHP 5.3 müssen Sie das Schlüsselwort use verwenden.

$bar = function() use(&$l) { 
}; 
$bar(); 

In PHP 5.2 und früher wird dies nicht funktionieren. Die Syntax, die Sie haben, ist keine Schließung, sondern die Definition einer globalen Funktion.

function foo() { function bar() { } } 

funktioniert genauso wie:

function foo() { include "file_with_function_bar.php"; } 

Wenn Sie Funktion ausführen foo zweimal, PHP wird sich beschweren, dass Sie versucht haben, neu zu definieren (global) Funktion bar.

+0

Zu viele Pronomen! Was wird bei der zweiten Hinrichtung sterben? Die äußere Variable oder die Variable, wie sie in der inneren Funktion benutzt wird? Und was bedeutet sterben (nicht snarky, will nur wissen). Bedeutet dies, dass die Variable nicht verwendet werden kann oder dass sie auf andere Weise wiederhergestellt werden muss? Ich nehme an, dass es stirbt (in welchem ​​Sinne auch immer), weil auf die geteilte Position, auf die beide zeigen, nach der ersten Ausführung nicht wieder hingewiesen werden kann? Was passiert, wenn die Variable statisch gemacht und danach wieder deaktiviert wird? – Anthony

+0

sterben heißt 'sterben (" Fatal Error ")'.Es gibt keine Closures oder inneren Funktionen in PHP <= 5.2 - Funktion innerhalb der Funktion ist nicht erlaubt, und die Tatsache, dass es kein Syntaxfehler ist, ist zufällig (es sollte ein sytnax error sein). PHP 5.3 ist völlig anders. Es erlaubt Funktionen innerhalb von Funktionen, aber mit etwas anderer Syntax. Sobald Sie die Syntax in PHP 5.3+ richtig verstanden haben, funktioniert es wie erwartet in anderen Sprachen. – Kornel