2010-01-01 3 views
8

Ho letto le nuove funzionalità di PHP 5.3 e una delle principali funzionalità è chiusure.Le chiusure PHP sono rotte o mi manca qualcosa?

Se non mi sbaglio molto male, gli sviluppatori PHP sono o:
a) confondendo le chiusure con solo funzioni anonime
b) le chiusure sono rotti in PHP 5.3.1 in cui sto testando

Da what wikipedia says le chiusure sono il meccanismo delle funzioni anonime più l'associazione delle variabili di ambito del genitore della funzione all'ambito della funzione. L'ultima parte sembra rotta in PHP.

Ho controllato bug PHP e non ho trovato nulla a riguardo, stranamente.

Ecco come sto testando:

<?php 

function getFun() { 
    $x = 2; 
    return function() { 
     return $x; 
    }; 
} 
$f = getFun(); // getFun()(); doesn't work -.- 
var_dump($f()); // $f() == null 

In lingue che in realtà attuare chiusure, restituisce 2:

def f(): 
    x = 2 
    return lambda: x 
print(f()()) # prints 2 

e

alert((function() { 
    var x = 2; 
    return function() { 
     return x; 
    }; 
})()()); // alerts 2 

Quindi, mi sbaglio o ?

+0

Non ho il nuovo php per testare :( –

risposta

12

le variabili ereditate dall'ambito esterno devono essere elencate in modo esplicito. dal manuale:

+0

In altre parole, un fondente. – Don

+0

lo chiamerei chiusura esplicita identificazione variabile, non un fondente. –

+2

Grazie, ho guardato in questo in un po ' più dettagli, e apparentemente l'uso è solo copiare le variabili e non legarle effettivamente all'ambito. Quindi, a meno che non si usi & $ tax (per la refference), se si modifica la tassa dopo la creazione della funzione anonima, si otterrà il vecchio valore dalla funzione creata in precedenza.In realtà PHP fa finta chiusure copiando vars invece di legarle effettivamente agli ambiti. – Prody

3

L'implementazione di chiusure di PHP è leggermente diversa da quella che ci si potrebbe aspettare se si è abituati a utilizzare JavaScript. Semplicemente chiamando function() { return x; } non funzionerà come è necessario approfittare della dichiarazione use.

+0

e grazie a Dio. –

+0

@Pekka Perché? –