quali sono i vantaggi della chiusura, principalmente per PHP?

6

Sto iniziando il processo di trasferimento del codice a PHP 5.3 e una delle funzionalità più pubblicizzate di PHP 5.3 è la possibilità di utilizzare chiusure. La mia comprensione delle chiusure è che esse consentono funzioni anonime, possono essere assegnate a nomi di variabili e hanno capacità di scoping interessanti.

Dal mio punto di vista, l'unico beneficio apparente nelle applicazioni del mondo reale è la riduzione della confusione nello spazio dei nomi perché le chiusure sono anonime.

Mi sbaglio in questo?

Dovrei provare a mettere le chiusure ovunque io codice?

Modifica :

Ho già letto questo post sulla chiusura di Javascript.

    
posta Patrick 01.02.2011 - 16:08
fonte

3 risposte

6

Prima di tutto: le chiusure non sono tutto ciò che descrivi come tale. Il concetto di funzioni come oggetti di prima classe è correlato - sebbene sia praticamente un prerequisito per le chiusure - e le funzioni anonime non sono realmente correlate (di solito si hanno entrambe nelle stesse lingue, ma non è necessario per il prossimo).

Sono giunto alla conclusione che per apprezzare le chiusure e metterle a frutto, è necessario adottare una mentalità leggermente più funzionale. Ad esempio: quando si utilizzano funzioni di ordine superiore (funzioni che restituiscono funzioni), la necessità di chiusure si verifica abbastanza spesso (in pratica ogni volta che la funzione restituita deve accedere agli argomenti della funzione di ordine superiore) e in effetti rappresentano la soluzione più naturale. Se stai scrivendo una classe per servire come factory accumulatore invece di una funzione di ordine superiore, ovviamente la chiusura non adattarsi.

Come esempio concreto: sto solo scrivendo un generatore di parser (piccolo, limitato, gentile) per XML definito in un database piuttosto strano (ma fortunatamente semplice - XML, il tipo di lavoro JSOn o YAML fa meglio) XSD offshot. I parser restituiti sono funzioni e circa ogni parser è una chiusura (che si chiude sulla rappresentazione dello schema con cui analizza). Preferisco non scrivere lezioni per tutto questo.

    
risposta data 01.02.2011 - 16:37
fonte
0

Come un ragazzo la cui responsabilità, tra le altre cose, è il test dell'unità in php utilizzando PhpUnit, Closures è anche un grande amico per testare un codice che non è stato scritto nei migliori saluti del test.

Circa due mesi fa ho assunto un team che stava sviluppando un progetto senza test di unità e così ha deciso di dedicare alcuni programmatori per imparare come testare e scrivere i test unitari. Il progetto aveva un localizzatore di servizi dappertutto, e dovevo trovare una soluzione su come risolvere il problema e con l'aiuto di un utente SO Elias Van Ootegem Sono stato in grado di .

Come menzionato nel post, puoi anche simulare i parametri passati e restituiti attraverso un riferimento.

Se hai una funzione da testare:

public function ReturnIntAndChangeOutputParameter(&$outputParameter = false)
{
    $outputParameter = true;
    return 10;
}

È possibile utilizzare la richiamata per simulare il ritorno del parametro:

$function = function(&$outputParameter)
{
    $outputParameter = true;
    return 10;
}

$classMock
    ->expects(/* */)
    ->method('ReturnIntAndChangeOutputParameter')
    ->will($this->returnCalback($function));

Infatti, durante la scrittura di unit test, questo è l'unico modo per farlo, PhpUnit converte altrimenti tutte le variabili da passare per valore anche se la definizione è passata per riferimento.

    
risposta data 07.01.2016 - 00:03
fonte
0

Un motivo principale per usare chiusure in PHP è ridurre le dipendenze tra gli oggetti. Ad esempio:

Route::get('help', function () {
  return View::make('site.help');
});

Perché Route dovrebbe conoscere la vista? Certo, potrei passare "site.help" in Route :: get, ma poi Route sarebbe legato a View. L'uso della chiusura mi aiuta a mantenere le classi indipendenti.

Questo è simile al modo in cui Wordpress utilizza i callback anonimi nella sua API Plugin. Questo semplice meccanismo IMO è ciò che ha reso i plug-in di Wordpress così di successo selvaggio, perché il framework Wordpress non sa nulla dei plugin, tuttavia i plug-in possono modificare qualsiasi cosa all'interno del framework CMS.

Questo è simile alla mia risposta Scopo della chiusura Stile in Laravel / PHP?

    
risposta data 24.02.2018 - 17:18
fonte

Leggi altre domande sui tag