Your SlideShare is downloading. ×
0
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Funzioni anonime in PHP 5.3

552

Published on

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

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
552
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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. Ma prima, alcuni termini <br />
  • 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. 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. 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. Cosa offre PHP<br />
  • 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. 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. 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. La sintassi delle funzioni anonime e delle closure <br />
  • 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. 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. 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. 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. Da provare<br />
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. ATTENZIONE<br />
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Serializzazione<br />Le funzioni anonime non si possono serializzare<br />35<br />Funzioni anonime in PHP 5.3<br />
  • 36. Alcuni casi d’uso<br />
  • 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. 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. È tutto!<br />
  • 40. Riferimenti<br />Manuale PHP:http://php.net/functions.anonymous<br />40<br />Funzioni anonime in PHP 5.3<br />
  • 41. Grazie!<br />Guarda il seminario web registrato: http://bit.ly/nM64No<br />

×