Funzioni Anonime in PHP 5.3<br />Elena Maria Brambilla 18 Luglio 2011<br />Guarda il seminario web registrato: http://bit....
Ma prima, alcuni termini <br />
Lambda<br />Da “lambda calcolo”<br />I nomi delle funzioni sono di pura “convenienza” e perciò tutte le funzioni sono cons...
Closure (o chiusure)<br />Una funzione che contiene un ambiente a riferimento<br />Ciascuna funzione ha il suo scope<br />...
Funzioni anonime<br />Ciascuna funzione definita e/o chiamata senza essere collegata a un identificatore<br />Si può asseg...
Cosa offre PHP<br />
Funtori<br />Ciascun oggetto che definisce un metodo __invoke()<br />Le istanze oggetto possono ora essere chiamate come s...
Funzioni anonime<br />Nuova classe Closure che definisce __invoke()<br />Il corpo __invoke() è “sostituito” con la funzion...
Importante da sapere:<br />Proprio come le normali funzioni PHP, le funzioni anonime esistono nel loro scope <br />Non è p...
La sintassi delle funzioni anonime e delle closure <br />
Concetti di base<br />Semplicemente, come una normale dichiarazione di funzione, tranne per fatto che non c’è il nome:<br ...
Assegnamento di variabile<br />Assegnamento di funzioni a variabili; non dimenticare il punto e virgola alla fine !<br />$...
Passaggio come argomento ad altri chiamabili <br />Permette un’altra funzionalità per chiamare la funzione <br />function ...
Creazione di closure<br />Collegare le variabili alla creazione e usarle all’atto della chiamata<br /> <br />$log = Zend_L...
Da provare<br />
Operazioni su array<br />Ordinamento (usort, uasort, etc.)<br />Scansione, mappatura, riduzione<br />Filtraggio<br />16<br...
Ordinamento<br />$stuff = array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’);<br />usort($stuff, function($a, $b) {<br />r...
Scansione<br />• La scansione permette di cambiare i valori di un array<br />• Se non si utilizzano oggetti, allora è nece...
Mappatura<br />La mappatura esegue un lavoro su ciascun elemento dell’array, il risultato sarà un nuovo array che contiene...
Riduzione<br />“Combina” gli elementi e restituisce un valore o un dataset <br />Il valore restituito è passato come primo...
Filtraggio<br />Restituisce solo gli elementi che sono riconosciuti come true<br />Spesso questa è considerata una forma d...
Operazioni su stringa<br />Espressioni regolari (preg_replace_callback)<br />Applicazione parziale (currying) degli argome...
preg_replace_callback()<br />Permette di trasformare le corrispondenze estratte<br /> <br />$string = "Today’s date next m...
Applicazione parziale (currying) degli argomenti<br />In alcuni casi si possono fornire argomenti predefiniti:<br />Per ri...
ATTENZIONE<br />
Riferimenti<br />Le variabili passate alle callback, come argomenti o come importazioni, non sono passate per riferimento<...
La combinazione con altri chiamabili<br />Problemi e considerazioni:<br />Closure è un “dettaglio di implementazione”; il ...
La combinazione con altri chiamabili<br />Tre modi per la chiamata (1/3):<br />$o($arg1, $arg2)<br />Vantaggi: velocità<br...
La combinazione con altri chiamabili<br />Tre modi per la chiamata (2/3):<br />call_user_func($o, $arg1, $arg2)<br />Vanta...
La combinazione con altri chiamabili<br />Tre modi per la chiamata (3/3):<br />call_user_func_array($o, $argv)<br />Vantag...
Non si può importare $this<br />Gli sviluppatori creativi vorrebbero usare le closure per il monkey-patch degli oggetti<br...
Non si può importare $this<br />Gli sviluppatori creativi vorrebbero usare le closure per il monkey-patch degli oggetti <b...
Non si può importare $this<br />Gli sviluppatori creativi vorrebbero usare le closure per il monkey-patch degli oggetti <b...
Esempio: Monkey-Patching<br />class Foo<br />{<br />public function __construct()<br />{<br />$self = $this;<br />$this->b...
Serializzazione<br />Le funzioni anonime non si possono serializzare<br />35<br />Funzioni anonime in PHP 5.3<br />
Alcuni casi d’uso<br />
Aspect Oriented Programming<br />Il codice definisce “aspetti,” oppure codice che taglia attraverso i limiti di più compon...
Esempio Gestione Eventi<br />$front->events()->attach(’dispatch.router.post’, function($e) use<br />($cache) {<br />$reque...
È tutto!<br />
Riferimenti<br />Manuale PHP:http://php.net/functions.anonymous<br />40<br />Funzioni anonime in PHP 5.3<br />
Grazie!<br />Guarda il seminario web registrato: http://bit.ly/nM64No<br />
Upcoming SlideShare
Loading in …5
×

Funzioni anonime in PHP 5.3

736 views

Published on

Scopri cosa sono le funzioni anonime in PHP 5.3 e in quali casi le puoi utilizzare.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
736
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Funzioni anonime in PHP 5.3

  1. 1. Funzioni Anonime in PHP 5.3<br />Elena Maria Brambilla 18 Luglio 2011<br />Guarda il seminario web registrato: http://bit.ly/nM64No<br />
  2. 2. Ma prima, alcuni termini <br />
  3. 3. Lambda<br />Da “lambda calcolo”<br />I nomi delle funzioni sono di pura “convenienza” e perciò tutte le funzioni sono considerate anonime<br />A meno che si stia utilizzando un vero linguaggio di programmazione funzionale con funzioni di prima classe, generalmente si usano funzioni anonime o espressionilambda<br />3<br />Funzioni anonime in PHP 5.3<br />
  4. 4. Closure (o chiusure)<br />Una funzione che contiene un ambiente a riferimento<br />Ciascuna funzione ha il suo scope<br />Permette lo stato nascosto <br />Un fattore di differenziazione è che le closure permettono i riferimenti collegati che esistono all’atto della creazione, da utilizzare quando sono chiamate<br />4<br />Funzioni anonime in PHP 5.3<br />
  5. 5. Funzioni anonime<br />Ciascuna funzione definita e/o chiamata senza essere collegata a un identificatore<br />Si può assegnare la funzione a una variabile, ma non si dà il nome proprio<br />5<br />Funzioni anonime in PHP 5.3<br />
  6. 6. Cosa offre PHP<br />
  7. 7. Funtori<br />Ciascun oggetto che definisce un metodo __invoke()<br />Le istanze oggetto possono ora essere chiamate come se fossero funzioni<br />class Command<br />{<br />public function __invoke($name)<br />{<br />echo "Ciao, $name";<br />}<br />}<br />$c = new Command();<br />$c(’Elena’); // "Ciao, Elena"<br />7<br />Funzioni anonime in PHP 5.3<br />
  8. 8. Funzioni anonime<br />Nuova classe Closure che definisce __invoke()<br />Il corpo __invoke() è “sostituito” con la funzione definita<br />Possibilità di collegare le variabili tramite importazioni, permettendo la creazione di closure<br />8<br />Funzioni anonime in PHP 5.3<br />
  9. 9. Importante da sapere:<br />Proprio come le normali funzioni PHP, le funzioni anonime esistono nel loro scope <br />Non è possibile importare $this<br />Non è possibile l’alias delle variabili importate<br />9<br />Funzioni anonime in PHP 5.3<br />
  10. 10. La sintassi delle funzioni anonime e delle closure <br />
  11. 11. Concetti di base<br />Semplicemente, come una normale dichiarazione di funzione, tranne per fatto che non c’è il nome:<br />function($value1[, $value2[, ... $valueN]]) { };<br />11<br />Funzioni anonime in PHP 5.3<br />
  12. 12. Assegnamento di variabile<br />Assegnamento di funzioni a variabili; non dimenticare il punto e virgola alla fine !<br />$greet = function($name) {<br />echo "Ciao, $name";<br />};<br />$greet(’Elena’); // "Ciao, Elena "<br />12<br />Funzioni anonime in PHP 5.3<br />
  13. 13. Passaggio come argomento ad altri chiamabili <br />Permette un’altra funzionalità per chiamare la funzione <br />function say($value, $callback)<br />{<br />echo $callback($value);<br />}<br />say(’Elena’, function($name) {<br />return "Ciao, $name";<br />}); // "Ciao, Elena"<br />13<br />Funzioni anonime in PHP 5.3<br />
  14. 14. Creazione di closure<br />Collegare le variabili alla creazione e usarle all’atto della chiamata<br /> <br />$log = Zend_Log::factory($config);<br />$logger = function() use($log) {<br />$args = func_get_args();<br />$log->info(json_encode($args));<br />};<br />$logger(’foo’, ’bar’); // ["foo", "bar"]<br />14<br />Funzioni anonime in PHP 5.3<br />
  15. 15. Da provare<br />
  16. 16. Operazioni su array<br />Ordinamento (usort, uasort, etc.)<br />Scansione, mappatura, riduzione<br />Filtraggio<br />16<br />Funzioni anonime in PHP 5.3<br />
  17. 17. Ordinamento<br />$stuff = array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’);<br />usort($stuff, function($a, $b) {<br />return strcasecmp($a, $b);<br />});<br />// ’Anise’, ’apple’, ’Applesauce’, ’appleseed’<br />17<br />Funzioni anonime in PHP 5.3<br />
  18. 18. Scansione<br />• La scansione permette di cambiare i valori di un array<br />• Se non si utilizzano oggetti, allora è necessario passare per riferimento per poter modificare i valori<br />$stuff = array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’);<br />array_walk($stuff, function(&$value) {<br />$value = strtoupper($value);<br />});<br />// ’APPLE’, ’ANISE’, ’APPLESAUCE’, ’APPLESEED’<br />18<br />Funzioni anonime in PHP 5.3<br />
  19. 19. Mappatura<br />La mappatura esegue un lavoro su ciascun elemento dell’array, il risultato sarà un nuovo array che contiene i valori restituiti <br />$stuff = array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’);<br />$mapped = array_map(function($value) {<br />$value = strtoupper($value);<br />return $value;<br />}, $stuff);<br />// $stuff: array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’)<br />// $mapped: array(’APPLE’, ’ANISE’, ’APPLESAUCE’, ’APPLESEED’)<br />19<br />Funzioni anonime in PHP 5.3<br />
  20. 20. Riduzione<br />“Combina” gli elementi e restituisce un valore o un dataset <br />Il valore restituito è passato come primo argomento della chiamata successiva<br />Effettua il seeding sul valore restituito passando un terzo argomento ad array_reduce()<br /> <br />$stuff = array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’);<br />$reduce = array_reduce($stuff, function($count, $input) {<br />$count += substr_count($input, ’a’);<br />return $count;<br />}, 0);<br />// $stuff: array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’)<br />// $reduce: 3<br />20<br />Funzioni anonime in PHP 5.3<br />
  21. 21. Filtraggio<br />Restituisce solo gli elementi che sono riconosciuti come true<br />Spesso questa è considerata una forma di mappatura ed è utilizzata per rifilare un dataste, solo su quegli elementi che sono di interesse primario per la riduzione<br />$stuff = array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’);<br />$reduce = array_reduce($stuff, function($count, $input) {<br />$count += substr_count($input, ’a’);<br />return $count;<br />}, 0);<br />// $stuff: array(’apple’, ’Anise’, ’Applesauce’, ’appleseed’)<br />// $reduce: 3<br />21<br />Funzioni anonime in PHP 5.3<br />
  22. 22. Operazioni su stringa<br />Espressioni regolari (preg_replace_callback)<br />Applicazione parziale (currying) degli argomenti<br />22<br />Funzioni anonime in PHP 5.3<br />
  23. 23. preg_replace_callback()<br />Permette di trasformare le corrispondenze estratte<br /> <br />$string = "Today’s date next month is " . date(’Y-m-d’);<br />$fixed = preg_replace_callback(’/(d{4}-d{2}-d{2})/’,<br />function($matches) {<br />$date = new DateTime($matches[1]);<br />$date->add(new DateInterval(’P1M’));<br />return $date->format(’Y-m-d’);<br />}, $string);<br />// "Today’s date next month is 2011-05-26"<br />23<br />Funzioni anonime in PHP 5.3<br />
  24. 24. Applicazione parziale (currying) degli argomenti<br />In alcuni casi si possono fornire argomenti predefiniti:<br />Per ridurre il numero di argomenti di cui si ha bisogno<br />Per fornire valori ad argomenti opzionali<br />Per fornire una signature unificata per le callback<br /> <br />$hs = function ($value) {<br />return htmlspecialchars($value, ENT_QUOTES, "UTF-8", false);<br />};<br />$filtered = $hs("<span>Matthew Weier O’Phinney</span>");<br />// "&lt;span&gt;Matthew Weier O'Phinney&lt;/span&gt;"<br />24<br />Funzioni anonime in PHP 5.3<br />
  25. 25. ATTENZIONE<br />
  26. 26. Riferimenti<br />Le variabili passate alle callback, come argomenti o come importazioni, non sono passate per riferimento<br />Utilizzare oggetti, oppure<br />Passare per riferimento <br />$count = 0;<br />$counter = function (&$value) use (&$count) {<br />if (is_int($value)) {<br />$count += $value;<br />$value = 0;<br />}<br />};<br />$stuff = array(’foo’, 1, 3, ’bar’);<br />array_walk($stuff, $counter);<br />// $stuff: array(’foo’, 0, 0, ’bar’)<br />// $count: 4<br />26<br />Funzioni anonime in PHP 5.3<br />
  27. 27. La combinazione con altri chiamabili<br />Problemi e considerazioni:<br />Closure è un “dettaglio di implementazione”; il typehinting (suggerimento di tipo) esclude gli altri tipi callback<br />is_callable()dice solo che può essere chiamato, ma non in che modo<br />is_callable() && is_object()dice che abbiamo un funtore, ma omette altri tipi callback<br />27<br />Funzioni anonime in PHP 5.3<br />
  28. 28. La combinazione con altri chiamabili<br />Tre modi per la chiamata (1/3):<br />$o($arg1, $arg2)<br />Vantaggi: velocità<br />Problemi: non funzionerà a meno che si abbiano un funtore, una closure o una chiamata a metodo statico <br />28<br />Funzioni anonime in PHP 5.3<br />
  29. 29. La combinazione con altri chiamabili<br />Tre modi per la chiamata (2/3):<br />call_user_func($o, $arg1, $arg2)<br />Vantaggi: velocità, funziona con tutti i chiamabili<br />Problemi: se il numero di argomenti è sconosciuto fino al runtime, diventa difficile la gestione<br />29<br />Funzioni anonime in PHP 5.3<br />
  30. 30. La combinazione con altri chiamabili<br />Tre modi per la chiamata (3/3):<br />call_user_func_array($o, $argv)<br />Vantaggi: funziona con tutti i chiamabili, funziona con un numero di argomenti variabile<br />Problemi: lentezza (impiega fino a 6 volte di più di una chiamata diretta)<br />30<br />Funzioni anonime in PHP 5.3<br />
  31. 31. Non si può importare $this<br />Gli sviluppatori creativi vorrebbero usare le closure per il monkey-patch degli oggetti<br />(Nota: Monkey patching è un modo per ampliare o modificare il runtime codice di linguaggi dinamicisenza alterare la fonte originale codice)<br />31<br />Funzioni anonime in PHP 5.3<br />
  32. 32. Non si può importare $this<br />Gli sviluppatori creativi vorrebbero usare le closure per il monkey-patch degli oggetti <br />È possibile. Solo che non si può usare $this, ciò significa che si presentano dei limiti ai metodi pubblici <br />32<br />Funzioni anonime in PHP 5.3<br />
  33. 33. Non si può importare $this<br />Gli sviluppatori creativi vorrebbero usare le closure per il monkey-patch degli oggetti <br />È possibile. Solo non si può usare $this, il che significa che si presentano dei limiti ai metodi pubblici<br />Inoltre non è possibile auto-dereferenziare le closure assegnate alle proprietà <br />33<br />Funzioni anonime in PHP 5.3<br />
  34. 34. Esempio: Monkey-Patching<br />class Foo<br />{<br />public function __construct()<br />{<br />$self = $this;<br />$this->bar = function () use ($self) {<br />return get_object_vars($self);<br />};<br />}<br />public function addMethod($name, Closure $c)<br />{<br />$this->$name = $c;<br />}<br />public function __call($method, $args)<br />{<br />if (property_exists($this, $method) &&<br />is_callable($this->$method)) {<br />return call_user_func_array($this->$method, $args);<br />}<br />}<br />}<br />34<br />Funzioni anonime in PHP 5.3<br />
  35. 35. Serializzazione<br />Le funzioni anonime non si possono serializzare<br />35<br />Funzioni anonime in PHP 5.3<br />
  36. 36. Alcuni casi d’uso<br />
  37. 37. Aspect Oriented Programming<br />Il codice definisce “aspetti,” oppure codice che taglia attraverso i limiti di più componenti <br />AOP formalizza un modo per congiungere gli aspetti ad altro codice.<br />Spesso, si potrebbe aver bisogno di effettuare il curry su argomenti per mantenere le signature.<br />37<br />Funzioni anonime in PHP 5.3<br />
  38. 38. Esempio Gestione Eventi<br />$front->events()->attach(’dispatch.router.post’, function($e) use<br />($cache) {<br />$request = $e->getParam(’request’);<br />if (!$request instanceof ZendHttpRequest || !$request->isGet())<br />{<br />return;<br />}<br />$metadata = json_encode($request->getMetadata());<br />$key = hash(’md5’, $metadata);<br />$backend = $cache->getCache(’default’);<br />if (false !== ($content = $backend->load($key))) {<br />$response = $e->getParam(’response’);<br />$response->setContent($content);<br />return $response;<br />}<br />return;<br />});<br />38<br />Funzioni anonime in PHP 5.3<br />
  39. 39. È tutto!<br />
  40. 40. Riferimenti<br />Manuale PHP:http://php.net/functions.anonymous<br />40<br />Funzioni anonime in PHP 5.3<br />
  41. 41. Grazie!<br />Guarda il seminario web registrato: http://bit.ly/nM64No<br />

×