2014-11-26 22 views
5

Mentre stavo leggendo domande per Zend Certified PHP Engineer 5.5 ho visto una domanda sulla funzione anonima ma ho bisogno di spiegare come funziona.php Funzione anonima

function z($x) 
{ 
    return function($y) use ($x) 
    { 
     return str_repeat($y , $x); 
    }; 
} 

$a = z(2); 
$b = z(3); 

echo $a(3).$b(2); 

L'uscita di questo codice è:

33222 

Ma nell'intestazione funzione c'è solo $x parametro da dove $y arrivati ​​valore!

risposta

3

Funzione z crea e restituisce una nuova funzione, ma un anonimo. Quella nuova funzione è definita in modo che abbia un argomento - $y. Tuttavia, questa funzione anonima utilizza anche l'argomento $x da una funzione z.

Per semplificare, la funzione z crea in pratica una funzione che può ripetere qualsiasi stringa, ma un numero fisso di volte. Il numero di volte in cui una stringa viene ripetuta è determinato dal valore dell'argomento $x in z.

Così, chiamando z(2) crea una nuova funzione che è funzionalmente equivalente a scrivere

function repeat_two_times($y) { 
    return str_repeat($y, 2); 
} 

In te ad esempio, il valore codificato duro 2 è determinato dal valore di $ x.

Ulteriori informazioni al riguardo sono disponibili nel numero documentation. Il principio visualizzato dall'esempio può essere molto utile per creare partial functions come add5, inc10, ...

2

In primo luogo, si inizializza funzione z:

$a = z(2); 

$x nell'esempio è impostato su 2, quindi la funzione restituito (funzione anonima, detta anche di chiusura) può ora essere letta come (perché $x utilizzato) :

$a = function($y) { 
    return str_repeat($y, 2); 
} 

Quando si richiama questa funzione:

echo $a(3); 

Si sta fornendo questa funzione di ritorno con il parametro 3 ($y).

L'output è: 33

1

Le funzioni anonime sono anche note come Closures.

Chiedi dove si trova il valore $y. L'esempio di codice è difficile da decifrare perché usi 2 e 3 ovunque. Le cose sarebbero più chiare se le tue ultime linee erano

$a = z(2); 
$b = z(3); 
echo $a('A').$b('B'); 

Ciò si tradurrebbe in:

AABBB 

Ma Seguiamo il codice.Si noti che ci sono due funzioni correlate chiama

$a = z(2); 

e

echo $a(3); 

funzione z() chiamata con argomento 2 restituisce una funzione (che viene assegnato nome $a) dove la linea

return str_repeat($y, $x); 

è in reality:

return str_repeat($y, 2); 

ora, si chiama quella funzione $a() con argomento 3. Quella 3 (valore $y) viene ripetuta due volte

La stessa analisi vale per l'altra funzione relativi bandi:

$b = z(3); 
... 
echo ... $b(2); 

Ma in questo caso 2 viene ripetuto 3 volte

0
function z($x) 
    { 
    return function($y) use ($x) 
    { 
     return str_repeat($y , $x); 
    }; 
    } 

    $a = z(2);// here you are setting value of x by 2 
    $b = z(3);// here you are setting value of x by 3 
echo $a(3).$b(2);// here $a(3) 3 is value of y so it becomes str_repeat(3 , 2); which is 33 
Problemi correlati