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

Contenu connexe

Tendances

PHP Template Engine (introduzione)
PHP Template Engine (introduzione)PHP Template Engine (introduzione)
PHP Template Engine (introduzione)Asmir Mustafic
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScriptGiovanni Buffa
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object OrientedManuel Scapolan
 
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsioneAlgoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsioneSergio Porcu
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiSergio Porcu
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Codemotion
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Php mysql e cms
Php mysql e cmsPhp mysql e cms
Php mysql e cmsorestJump
 
[BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA][BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA]Matteo Collica
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourserik0
 
Excel Funzioni per la manipolazione delle stringhe, funzioni condizionali sem...
Excel Funzioni per la manipolazione delle stringhe, funzioni condizionali sem...Excel Funzioni per la manipolazione delle stringhe, funzioni condizionali sem...
Excel Funzioni per la manipolazione delle stringhe, funzioni condizionali sem...I.S.I.S. "Antonio Serra" - Napoli
 

Tendances (20)

PHP Template Engine (introduzione)
PHP Template Engine (introduzione)PHP Template Engine (introduzione)
PHP Template Engine (introduzione)
 
OOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni LambdaOOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni Lambda
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object Oriented
 
Comandi bash
Comandi bashComandi bash
Comandi bash
 
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsioneAlgoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
Js intro
Js introJs intro
Js intro
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Corso di php01
Corso di php01Corso di php01
Corso di php01
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 
Php mysql e cms
Php mysql e cmsPhp mysql e cms
Php mysql e cms
 
Bash Scripting
Bash ScriptingBash Scripting
Bash Scripting
 
[BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA][BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA]
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourse
 
Excel Funzioni per la manipolazione delle stringhe, funzioni condizionali sem...
Excel Funzioni per la manipolazione delle stringhe, funzioni condizionali sem...Excel Funzioni per la manipolazione delle stringhe, funzioni condizionali sem...
Excel Funzioni per la manipolazione delle stringhe, funzioni condizionali sem...
 

Similaire à Funzioni anonime in PHP 5.3

Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaRobert Casanova
 
AngularJS: server communication
AngularJS: server communicationAngularJS: server communication
AngularJS: server communicationVittorio Conte
 
Le funzioni in javascript
Le funzioni in javascriptLe funzioni in javascript
Le funzioni in javascriptPaoloCaramanica
 
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018Marco Chiesi
 
Drupal 7 : theming avanzato
Drupal 7 : theming avanzatoDrupal 7 : theming avanzato
Drupal 7 : theming avanzatoTwinbit
 
Facebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parteFacebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parteAngelo Iacubino
 
Gianfrasoft Corso Di Php Parte 3
Gianfrasoft   Corso Di Php   Parte 3Gianfrasoft   Corso Di Php   Parte 3
Gianfrasoft Corso Di Php Parte 3Gianfranco Fedele
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritornolordarthas
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewFrancesco Sciuti
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 

Similaire à Funzioni anonime in PHP 5.3 (20)

introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
Codemotion workshop
Codemotion workshopCodemotion workshop
Codemotion workshop
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguida
 
Php e database: php mysql
Php e database: php mysqlPhp e database: php mysql
Php e database: php mysql
 
AngularJS: server communication
AngularJS: server communicationAngularJS: server communication
AngularJS: server communication
 
Le funzioni in javascript
Le funzioni in javascriptLe funzioni in javascript
Le funzioni in javascript
 
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
 
Drupal 7 : theming avanzato
Drupal 7 : theming avanzatoDrupal 7 : theming avanzato
Drupal 7 : theming avanzato
 
Facebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parteFacebook Developer Garage Venice 2 parte
Facebook Developer Garage Venice 2 parte
 
Gianfrasoft Corso Di Php Parte 3
Gianfrasoft   Corso Di Php   Parte 3Gianfrasoft   Corso Di Php   Parte 3
Gianfrasoft Corso Di Php Parte 3
 
Bash intro
Bash introBash intro
Bash intro
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 
PHP 7 - benvenuto al futuro
PHP 7 - benvenuto al futuroPHP 7 - benvenuto al futuro
PHP 7 - benvenuto al futuro
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
 
PHP7 e Rich Domain Model
PHP7 e Rich Domain ModelPHP7 e Rich Domain Model
PHP7 e Rich Domain Model
 

Plus de Zend by Rogue Wave Software

Building and managing applications fast for IBM i
Building and managing applications fast for IBM iBuilding and managing applications fast for IBM i
Building and managing applications fast for IBM iZend by Rogue Wave Software
 
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Speed up web APIs with Expressive and Swoole (PHP Day 2018) Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Speed up web APIs with Expressive and Swoole (PHP Day 2018) Zend by Rogue Wave Software
 
The Sodium crypto library of PHP 7.2 (PHP Day 2018)
The Sodium crypto library of PHP 7.2 (PHP Day 2018)The Sodium crypto library of PHP 7.2 (PHP Day 2018)
The Sodium crypto library of PHP 7.2 (PHP Day 2018)Zend by Rogue Wave Software
 
Develop web APIs in PHP using middleware with Expressive (Code Europe)
Develop web APIs in PHP using middleware with Expressive (Code Europe)Develop web APIs in PHP using middleware with Expressive (Code Europe)
Develop web APIs in PHP using middleware with Expressive (Code Europe)Zend by Rogue Wave Software
 

Plus de Zend by Rogue Wave Software (20)

Develop microservices in php
Develop microservices in phpDevelop microservices in php
Develop microservices in php
 
Speed and security for your PHP application
Speed and security for your PHP applicationSpeed and security for your PHP application
Speed and security for your PHP application
 
Building and managing applications fast for IBM i
Building and managing applications fast for IBM iBuilding and managing applications fast for IBM i
Building and managing applications fast for IBM i
 
Building web APIs in PHP with Zend Expressive
Building web APIs in PHP with Zend ExpressiveBuilding web APIs in PHP with Zend Expressive
Building web APIs in PHP with Zend Expressive
 
To PHP 7 and beyond
To PHP 7 and beyondTo PHP 7 and beyond
To PHP 7 and beyond
 
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Speed up web APIs with Expressive and Swoole (PHP Day 2018) Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
 
The Sodium crypto library of PHP 7.2 (PHP Day 2018)
The Sodium crypto library of PHP 7.2 (PHP Day 2018)The Sodium crypto library of PHP 7.2 (PHP Day 2018)
The Sodium crypto library of PHP 7.2 (PHP Day 2018)
 
Develop web APIs in PHP using middleware with Expressive (Code Europe)
Develop web APIs in PHP using middleware with Expressive (Code Europe)Develop web APIs in PHP using middleware with Expressive (Code Europe)
Develop web APIs in PHP using middleware with Expressive (Code Europe)
 
Middleware web APIs in PHP 7.x
Middleware web APIs in PHP 7.xMiddleware web APIs in PHP 7.x
Middleware web APIs in PHP 7.x
 
Ongoing management of your PHP 7 application
Ongoing management of your PHP 7 applicationOngoing management of your PHP 7 application
Ongoing management of your PHP 7 application
 
Developing web APIs using middleware in PHP 7
Developing web APIs using middleware in PHP 7Developing web APIs using middleware in PHP 7
Developing web APIs using middleware in PHP 7
 
The Docker development template for PHP
The Docker development template for PHPThe Docker development template for PHP
The Docker development template for PHP
 
The most exciting features of PHP 7.1
The most exciting features of PHP 7.1The most exciting features of PHP 7.1
The most exciting features of PHP 7.1
 
Unit testing for project managers
Unit testing for project managersUnit testing for project managers
Unit testing for project managers
 
The new features of PHP 7
The new features of PHP 7The new features of PHP 7
The new features of PHP 7
 
Deploying PHP apps on the cloud
Deploying PHP apps on the cloudDeploying PHP apps on the cloud
Deploying PHP apps on the cloud
 
Data is dead. Long live data!
Data is dead. Long live data! Data is dead. Long live data!
Data is dead. Long live data!
 
Optimizing performance
Optimizing performanceOptimizing performance
Optimizing performance
 
Resolving problems & high availability
Resolving problems & high availabilityResolving problems & high availability
Resolving problems & high availability
 
Developing apps faster
Developing apps fasterDeveloping apps faster
Developing apps faster
 

Funzioni anonime in PHP 5.3

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