Qual è la differenza tra i parametri di chiusura e la parola chiave 'use'?

Questo mi ha molto confuso e non riesco a trovare una risposta a questa domanda. Un chiarimento chiaro e semplice sarebbe bello.

Una chiusura è una function valutata nel proprio ambiente, che ha una o più variables associate a cui è ansible accedere quando viene chiamata la function. Provengono dal mondo della programmazione funzionale, where ci sono una serie di concetti in gioco. Le chiusure sono come funzioni lambda, ma più intelligenti nel senso che hanno la capacità di interagire con le variables dall'ambiente esterno di where è definita la chiusura.

La parola chiave use () consente di importre variables dall'esterno dell'ambiente della function, all'interno della function. Le variables da importre dall'ambiente esterno sono specificate nella clausola use della definizione della function di chiusura. Per impostazione predefinita, vengono passati per valore. Quindi diciamo che la function non ha parametri, ma non vuoi usare una variabile che hai già.

$string = "Hello World!"; $closure = function() use ($string) { echo $string; }; 

Ciò è utile quando è necessario creare una function che deve essere utilizzata come callback da qualche altra parte e può avere solo parametri definiti. La parola chiave use () consente di utilizzare altre variables oltre a quelle passate come argomentazioni di funzioni. Ad esempio nell'esempio php.net: http://php.net/manual/en/functions.anonymous.php

 public function getTotal($tax) { $total = 0.00; $callback = function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; arrays_walk($this->products, $callback); return round($total, 2); } 

$ callback deve avere solo due parametri, perché arrays_walk consentirà solo molto:

In genere, funcname assume due parametri. Il valore del parametro dell'arrays è il primo e il secondo chiave / indice.

Quindi cosa possiamo fare? Chiamiamo use() per aggiungere altre variables che non sono l'ambito $ callback, ma nell'ambito dell'ambito in cui viene chiamato.

L' use statement acquisisce la variabile al momento della creazione della function di chiusura .

Gli argomenti delle funzioni regolari acquisiscono il valore quando viene chiamata la function.

 function makeAnAdder($leftNum) { // Notice that *each time* this makeAnAdder function gets called, we // create and then return a brand new closure function. $closureFunc = function($rightNum) use ($leftNum) { return $leftNum + $rightNum; }; return $closureFunc; } $add5to = makeAnAdder(5); $add7to = makeAnAdder(7); echo $add5to(10); // 15 echo $add7to(1); // 8 

Se ci fosse un modo per ispezionare il, um, "codice sorgente" della function $add5to , sarebbe simile a questo:

 function($rightNum) { return 5 + $rightNum; } 

Immagino si possa dire che il valore di $leftNum stato integrato nella function.