Sviluppare in PHP 7

PHP è tra i linguaggi di programmazione più utilizzati al mondo per lo sviluppo di applicazioni web. Questa seconda edizione del manuale di Enrico Zimuel, esperto di fama internazionale, offre una revisione approfondita del libro con l’aggiunta di due capitoli sulle ultime novità delle versioni 7.3 e 7.4 del linguaggio e sull’utilizzo dei design pattern più utilizzati nei progetti PHP.

Il libro è adatto sia a chi vuole imparare a programmare in PHP a livello professionale sia a chi lo utilizza già da qualche anno.

Il manuale parte dalle basi del linguaggio per arrivare allo sviluppo di applicazioni web basate su architetture MVC o middleware, utilizzando lo standard PSR-7. Vengono presentati i moderni strumenti di sviluppo, come l’utilizzo di composer, la gestione dei codici sorgenti tramite git, i test unitari con PHPUnit, il deploy di applicazioni tramite Deployer e Ansible, la gestione dei database MySQL e MongoDB, l’utilizzo di ORM come Doctrine.

Un intero capitolo è dedicato al tema dello sviluppo di web API con architetture REST, utilizzando un approccio middleware o tramite il progetto open source Apigility.

All’indirizzo www.sviluppareinphp7.it si possono scaricare i codici sorgenti presenti nel libro.

Gli argomenti trattati

◾ Le nuove funzionalità del linguaggio, come la dichiarazione dei tipi scalari e l’utilizzo dei tipi sulle proprietà di classe.

◾ La programmazione a oggetti, con le basi del linguaggio, i trait, le classi anonime, la dependency injection e i design pattern più utilizzati nei progetti PHP.

◾ Lo sviluppo di applicazioni MVC con Zend Framework 3 (Laminas) e le nuove architetture middleware con esempi in Expressive.

◾ L’utilizzo di Composer per la gestione delle librerie, di PHPUnit per i test unitari e di Git per il versionamento dei sorgenti.

◾ Lo standard PSR-7 per lo sviluppo di web API.

◾ La sicurezza delle applicazioni PHP con le ultime novità crittografiche del linguaggio.

◾ Le altre novità di PHP 7.4 come il preloading, il Foreign Function Interface (FFI), il weak reference, etc.

Enrico Zimuel è programmatore dal 1996 e Principal Software Engineer presso Elastic (Mountain View). È autore di diversi progetti open source; docente di PHP Programming presso l’ITS ICT Piemonte; speaker TEDx e relatore in più di 100 conferenze internazionali. È un PHP Certified Engineer e membro della Linux Foundation per il progetto Laminas. Laureato cum laude in Economia Informatica è il cofondatore del PHP User Group di Torino, dove vive e lavora (da remoto).

Sviluppare in PHP 7

II EDIZIONE

Sviluppare in PHP 7

II EDIZIONE

Enrico Zimuel

Copyright per l’edizione italiana:

© 2019 Tecniche Nuove, via Eritrea 21, 20157 Milano

Redazione: tel. 0239090258

e-mail: libri@tecnichenuove.com

Vendite: tel. 0239090440, fax 0239090335

e-mail: vendite-libri@tecnichenuove.com

http://www.tecnichenuove.com

ISBN: 978-88-481-4031-7

ISBN (PDF): 978-88-481-4032-4

ISBN (E-PUB): 978-88-481-4033-1

Tutti i diritti sono riservati. Nessuna parte del libro può essere riprodotta o diffusa con un mezzo qualsiasi, fotocopie, microfilm o altro, senza il permesso dell’editore

All rights reserved. No part of this book shall be reproduced, stored in a retrieval system, or transmitted, by any means, electronic, mechanical photocopying, recording or otherwise without written permission from the publisher

Realizzare un libro è un’operazione complessa, che richiede numerosi controlli: sul testo, sulle immagini e sulle relazioni che si stabiliscono tra essi. L’esperienza suggerisce che è praticamente impossibile pubblicare un libro privo di errori. Saremo quindi grati ai lettori che vorranno segnalarceli.

Realizzazione editoriale: Mokarta sas, Gorgonzola (MI)

Questo libro è disponibile e acquistabile in versione digitale su www.tecnichenuove.com

A Valentina e Alberto,
i 10 amori della mia vita.

Prefazione

Ovvero “come ho imparato a non preoccuparmi e ad amare lo sviluppo web”.

Una ricerca veloce su Internet volta a conoscere nel più breve tempo possibile quale sia il linguaggio più importante o anche solo il più popolare nell’ambito dello sviluppo web non vi lascerà soddisfatti. Se sarete fortunati incapperete in una lista di almeno 10 linguaggi di programmazione che, vi verrà detto, dovrete imparare a usare a livello avanzato se volete spacciare sul vostro curriculum l’essere degli sviluppatori esperti di siti web. È probabile che se aveste effettuato questa ricerca qualche anno fa o se la rifarete tra qualche anno, la lista dei risultati vi avrà mostrato e vi mostrerà delle liste sostanzialmente diverse. Con qualche piccola eccezione. Ad esempio, un invariante dagli albori del Web a oggi (e, ci scommetto, anche per il futuro) è HTML. Non è un linguaggio di programmazione, anche se a volte nei curriculum si trova sotto questa voce (il che già la direbbe lunga sulla competenza di chi un tale cv lo ha compilato…), ma serve a comporre e a fornire una semantica minimale alla vostra pagina web. Il Web è praticamente nato con HTML, la cui prima versione è stata rilasciata nel 1993 e che oggi si è evoluto nella versione 5. È facile da imparare, ma parecchio limitato se la vostra intenzione è quella di avere delle pagine che abbiano stile e carattere.

Per aggiungere stile al vostro sito, già dal 1994 esiste un linguaggio di descrizione della presentazione del vostro documento scritto in HTML. Si chiama CSS, oggi è arrivato alla sua terza versione e, da quando è stato introdotto, ha fatto coppia fissa con HTML. Se fossi un informatico teorico vi direi che ci possiamo fermare qui: qualcuno si è divertito a dimostrare che HTML5 e CSS3, insieme, costituiscono un linguaggio “Turing complete”. In altre parole, se un problema è un problema computazionale e, pertanto, può essere risolto per mezzo di un algoritmo, allora il gioco è fatto: potete senz’altro trovare una sequenza di istruzioni HTML5/CSS3 che possa convertire quell’algoritmo in qualcosa che la macchina interpreta ed esegue automaticamente.

Faccio pubblica ammenda: non sono un informatico teorico. Per quanto nel mio lavoro di ricercatore mi nutra quotidianamente di formalizzazioni, strumenti matematici, modelli e sperimentazioni che devono seguire una metodologia rigorosa e solida dal punto di vista teorico, nella mia attività quotidiana e in quella dei miei collaboratori c’è sempre quel momento in cui è necessario scrivere del codice il più velocemente possibile, nel modo migliore possibile: è l’approccio che alcuni chiamano “quick and dirty” e alzi la mano chi non abbia mai avuto bisogno di ricorrervi e che spesso si sia trovato nelle condizioni di ammettere di non essere sufficientemente “quick” o che gli strumenti a disposizione non fossero abbastanza “dirty”.

Abbandonata la risposta facile dal punto di vista teorico che cerca di convincervi che HTML5 e CSS3 contengono già tutto quello di cui avete bisogno per sviluppare siti web completi e dinamici, rimane allora il problema di quale linguaggio adottare per gestire l’interazione, la gestione di dati, la personalizzazione, le animazioni, etc. Insomma, tutto quello che oggi siamo abituati a pensare essere la chiave di un sito web.

Tornando agli albori del Web, la risposta era immediata: potevano essere creati dei programmi in linguaggio C da inserire nella cartella “cgi-bin” lato server. L’output di questi programmi viaggiava dritta dritta sulla connessione TCP stabilita dal protocollo HTTP, arrivava all’host che eseguiva il browser e che aveva effettuato la richiesta di accesso alla pagina, con il comando GET o POST che fosse. Questa sequenza di caratteri finalmente giunta in input al processo client veniva quindi passata al modulo di “render” del browser per essere fruita dall’utente. Il modo più pulito per fare questo era che l’output, pertanto, fosse formattato già direttamente nel linguaggio HTML grazie a una sequenza interminabile di istruzioni printf. Chiunque abbia sviluppato per il Web tra il 1993 e il 1996 sa benissimo di cosa sto parlando. Non deve sorprendere che la diffusione in termini di popolarità di linguaggi di alto livello molto potenti (e tra di loro molto diversi) quali PERL e JAVA abbia tolto il linguaggio C dal trono del controllo server-side. Da un punto di vista tecnologico quello sembrava un punto di arrivo, ma era solo l’inizio di una rivoluzione.

Come spesso accade, le cose si complicarono velocemente: la qualità dei siti web raggiungibili da un comune browser diveniva sempre più professionale, l’aspettativa da parte dei clienti e degli operatori del settore saliva di conseguenza, formando un circolo al contempo virtuoso e vizioso che pretendeva lo sviluppo di siti sempre più dinamici, interattivi e personalizzabili in tempi decisamente stretti. JAVA non consentiva, oggi come allora, di fare le cose velocemente, “quick”, appunto, mentre dall’altra parte dello spettro, PERL, forse “dirty” lo era fin troppo. Inoltre, come già accadeva per C, l’integrazione con HTML appariva forzata.

Non mi dilungherò qui sulla tecnologia su cui nessuno avrebbe davvero scommesso e che oggi è imprescindibile nel ciclo di vita di un serio sviluppo “full-stack”: JavaScript. Il mondo dello sviluppo client-side è ancora oggi in piena evoluzione e difficilmente oggi possiamo pensare a un sito web efficiente e dinamico che non utilizzi JavaScript. Glisserò anche sulla rivoluzione apportata da HTTP 2.0 al protocollo che realizza il Web su reti TCP/IP e che consentiva il superamento del principio “state-less” introducendo le gioie e i dolori dei “cookie”. Ci sarebbero tante cose da dire, ma ci vorrebbe un’altra prefazione per un altro libro. I paragrafi precedenti, invece, erano funzionali a dare un’idea del carattere di novità apportato da PHP al suo ingresso nel mondo degli sviluppatori: finalmente un linguaggio che permetteva di realizzare un sito dinamico in modalità “quick e dirty”, veloce come PERL, ma totalmente a suo agio all’interno di pagine web che potevano alternare righe scritte in normalissimo codice HTML e altre che contenevano sequenze di istruzioni PHP. Veloce, sporco, ma decisamente più leggibile nell’ambito dello sviluppo web rispetto ai suoi diretti concorrenti C e PERL.

Le innovazioni hanno bisogno di tempo prima di affermarsi: personalmente ho ignorato l’esistenza di PHP fino a quando non è stata rilasciata la versione 3 ed ho iniziato a usarlo costantemente dalla versione 4 in poi. Fino a quel momento perseverai in quella che oggi mi sembra sia stata una follia: alla fine degli anni ’90, se si trattava di sviluppare del codice da eseguire lato server, preferivo rimanere all’interno della mia “comfort-zone”, continuando a scrivere istruzioni in linguaggio C in file che potevo comodamente modificare con l’editor VI. Preistoria: la mia conversione personale risale al 2000, proprio nel bel mezzo della prima bolla .com. Eppure proprio grazie a PHP, in quegli anni, ho iniziato a pensare seriamente che sviluppare per il Web fosse una cosa bella.

Da allora ho osservato, da utilizzatore, come questo linguaggio si sia trasformato in qualcosa sempre meno “dirt”, pur mantenendo la sua caratteristica “quick”. PHP 5 ha “osato” introdurre il paradigma della programmazione orientata agli oggetti, rendendo possibile un’ingegnerizzazione professionale e industriale dell’applicazione web finalmente concorrenziale al mondo JAVA. Le connessioni PDO hanno reso il passaggio dalle fasi di produzione a quelle di installazione e messa in esercizio decisamente meno doloroso. Le metodologie di testing si sono evolute (e questo libro che avete tra le mani vi fornisce una sezione chiarissima ed esauriente per sviluppare delle unità di test in modo professionale). Infine, ma sono sicuro che la storia di questo linguaggio andrà ben oltre nel futuro, siamo arrivati alla versione 7, che l’autore, Enrico Zimuel, vi illustra in questo volume interamente in italiano in modo tecnicamente preciso e didatticamente impeccabile. Studiando PHP 7 avrete difficoltà a immaginare che questo linguaggio sia stato salutato come la doverosa soluzione “sporca” a un problema che fino a quel momento veniva visto come il refugium peccatorum degli sviluppatori che avrebbero voluto scrivere codice e invece erano finiti a “fare siti web”. PHP 7 oggi è un linguaggio completo, allo stato dell’arte per quanto riguarda i paradigmi di programmazione e consente l’adozione di pattern di sviluppo moderni ed efficaci. Per non parlare della sua efficienza, che nulla ha a che vedere con la fama che si è guadagnato con le versioni precedenti e che oggi ha davvero poco da invidiare rispetto alle sue alternative. Non ha perso la sua vocazione principale e mentre C, JAVA e Python li trovate impiegati negli ambiti più disparati, PHP rimane il linguaggio per sviluppare soluzioni web lato server: ma è quello che vuole essere ed è per questo che lo fa bene.

Certamente le sfide del programmatore esperto di PHP oggi sono numerose: dagli albori del Web molti altri linguaggi e strumenti sono stati introdotti che hanno vissuto alcune stagioni di autentico successo. In alcuni casi, si tratta di tecnologie che rimarranno nel tempo, anche se nessuno ha la sfera di cristallo per poter dire quale tra queste sopravvivrà. La dannazione dell’informatico è quella di un professionista che non potrà mai permettersi di rimanere al calduccio della sua “comfort zone”. Ci sarà un momento in cui si dovrà passare ad altro, ma decisamente quel momento, per quanto riguarda PHP, non è ancora arrivato.

Per quanto mi riguarda la lettura di questo libro è stata per me l’occasione di fare una passeggiata in un’automobile nuova di zecca con un caro amico, con una differenza fondamentale: ancora una volta io ero uno di quelli che doveva imparare i nuovi optional di quella macchina per usarli al meglio, ma anche per insegnarli. Enrico Zimuel, invece, molti di quegli optional ha contribuito a progettarli e a inserirli nell’ultimo modello, affinché quel veicolo rimanesse sempre all’avanguardia. Imparare a guidare un’auto in tale compagnia è un privilegio che non ha prezzo.

Giancarlo Ruffo

Giancarlo Ruffo è Professore Associato presso il Dipartimento di Informatica dell’Università degli Studi di Torino e insegna PHP dal 2011 all’interno del corso di “Tecnologie web”. Si occupa di analisi di dati, reti complesse e scienze sociali computazionali e dirige il gruppo di ricerca ARC2S http://arcs.di.unito.it presso lo stesso dipartimento. Ha scritto più di 70 articoli scientifici pubblicati in riviste e atti di conferenze prevalentemente internazionali. Per analizzare dati privilegia l’uso di Python e per divertirsi e ricordare i bei tempi andati sogna di tornare prima o poi a programmare in C, ma ammira la professionalità degli esperti programmatori JAVA. Se deve scrivere del codice server side per un’applicazione web non ha dubbi e si concede al suo “dirty pleasure”: il PHP.

Introduzione

Quella che state leggendo è la seconda edizione del libro. Dopo il successo della prima e grazie ai numerosi feedback che ho ricevuto ho pensato di aggiornare il contenuto del libro, fermo alla versione 7.2 di PHP.

Questa nuova edizione contiene due capitoli in più. Il Capitolo 11 sui design pattern in PHP e il Capitolo 12 con le novità di PHP 7.3 e le ultimissime novità di PHP 7.4, che mentre scrivo non è ancora disponibile, la data prevista è il 28 novembre 2019.

PHP è un linguaggio di programmazione per lo sviluppo di applicazioni web nato nel lontano 1995. È utilizzato da circa l’80% di tutti i siti internet del mondo. Queste cifre parlano da sole, una tecnologia consolidata che si è diffusa negli anni a macchia d’olio.

Quali sono le caratteristiche che hanno reso PHP uno dei linguaggi più utilizzati sul web?

Sicuramente, la semplicità d’utilizzo di questa tecnologia. La curva di apprendimento di questo linguaggio è molto bassa, chiunque può imparare le basi del linguaggio in pochissimo tempo. Un’altra caratteristica vincente è l’infrastruttura snella, di facile installazione e onnipresente su tutte le piattaforme. PHP è un linguaggio interpretato che gira praticamente su tutti i sistemi operativi del mondo, compresi i sistemi IBM.

Un altro punto di forza è la sua community. Migliaia di software open source sono scritti in PHP, tra i tanti basti citare Wordpress, Drupal, Magento, WikiMedia. Inoltre, è possibile trovare una libreria o un framework PHP per qualsiasi esigenza.

La versione 7 di PHP ha segnato una nuova rinascita del linguaggio. Grazie alla riscrittura completa del motore del linguaggio, le performance di esecuzione di PHP 7 sono da record: è tra i più veloci linguaggi interpretati del mondo! Questa nuova versione ha introdotto numerose funzionalità interessanti, utilizzabili anche per applicazioni enterprise.

In questo libro si introduce l’utilizzo del linguaggio PHP 7 per lo sviluppo di applicazioni web professionali. Vengono introdotte le basi del linguaggio per arrivare, passo dopo passo, a sviluppare un’applicazione PHP a livello professionale. Per professionale intendo un’applicazione che consideri l’infrastruttura da utilizzare, l’utilizzo di basi di dati, i sistemi di monitor e logging, la scalabilità, la sicurezza, etc. Ho cercato di affrontare tutti questi aspetti nelle pagine di questo libro, offrendo qualche consiglio e spunto di riflessione ove possibile. Sono ormai tanti anni che utilizzo PHP a livello professionale. Ho avuto il piacere e la fortuna di lavorare a stretto contatto con gli autori del linguaggio a partire dalla versione 3 ossia Andi Gutmans e Zeev Suraski e negli anni, viaggiando per conferenze, ho conosciuto la maggior parte dei core contributor attuali. Ho potuto sporcarmi le mani con il codice C dello Zend Engine, per capire come funzionasse PHP under the hood.

Inoltre, ho macinato codice PHP insieme a numerosi programmatori di talento in tutto il mondo, sviluppando diverse librerie open source in PHP (Apigility, Expressive, Zend Framework, etc.), imparando da loro diversi trucchi e best practice. Con questo libro ho cercato di condividere queste mie esperienze anche legate alla gestione di un progetto open source.

Com’è organizzato questo libro

I capitoli che troverete in questa seconda edizione del libro sono così suddivisi.

Nel Capitolo 1 viene introdotto PHP, evidenziando il percorso storico e l’evoluzione del linguaggio. Si introduce anche il motore del linguaggio, lo Zend Engine, illustrando l’architettura interna del linguaggio. Oltre al linguaggio, sono messi in evidenza l’ecosistema di PHP e la sua community, in forte crescita.

Nel Capitolo 2 si introducono le basi del linguaggio. Vengono presentate le variabili, le condizioni, i cicli iterativi, gli array, le funzioni, la ricorsione, etc. Particolare rilievo è dato alle nuove funzionalità della versione 7, come la dichiarazione di tipi scalari (scalar type declaration), l’utilizzo dei tipi void e nullable, l’operatore variadic, spaceship, null coalesce, etc.

Nel Capitolo 3 viene introdotta la Programmazione Orientata agli Oggetti (OOP). Vengono illustrate le classi, i namespace, le funzioni di autoload, l’ereditarietà, le classi astratte e final, le interfacce, i traits, le classi anonime, etc.

Nel Capitolo 4 viene affrontato l’argomento della gestione degli errori. Spesso questo argomento è sottovalutato ma è una caratteristica fondamentale di un’applicazione professionale. In questo capitolo vengono presentate le varie tipologie di errore, la gestione dei log e la nuova gerarchia delle eccezioni di PHP 7.

Nel Capitolo 5 vengono illustrate le metodologie e le tecniche per la gestione di un progetto PHP. In particolare, viene introdotto l’utilizzo di composer, del versionamento del codice tramite git, dell’utilizzo dei test automatici con PHPUnit, dell’organizzazione dei file in un progetto, etc. Inoltre viene affrontato il tema della scelta di un progetto open source, di quali caratteristiche tener presente e degli indicatori da utilizzare.

Nel Capitolo 6 viene affrontato il tema della persistenza dei dati tramite file e database. Per i file sono illustrate le tecniche di base e alcune delle funzionalità avanzate, come le operazioni di lock. Inoltre, sono presi in esame i formati CSV, JSON e XML. Per i database relazionali vengono forniti esempi d’utilizzo con PDO e tramite ORM come Doctrine. Per i database NoSQL viene introdotto l’utilizzo di MongoDB.

Nel Capitolo 7 si introduce l’utilizzo di PHP come linguaggio per il web. Viene illustrato il protocollo HTTP e le funzioni PHP per la gestione del flusso in ingresso e in uscita in un’applicazione web. Viene introdotto l’utilizzo dei web server come Apache, nginx e il PHP web server. Sono anche forniti esempi sull’invio di dati, l’upload dei file, la gestione dei template HTML, le sessioni, etc. Particolare risalto è dato all’utilizzo dello standard PSR-7 per la gestione dei messaggi HTTP.

Nel Capitolo 8 vengono introdotte le architetture MVC e middleware con l’utilizzo dei progetti open source Zend Framework e Expressive. Inoltre, viene affrontato il tema del deploy di un’applicazione PHP con l’utilizzo dei progetti Deployer e Ansible e della virtualizzazione di un’applicazione web tramite Vagrant e Docker.

Nel Capitolo 9 si affronta il tema dello sviluppo di web API in PHP. Vengono illustrate le architetture REST e l’utilizzo degli hypermedia. Sono affrontati i temi della content negotiation, del versionamento, dell’utilizzo dei formati JSON e HAL, dei sistemi di autenticazione HTTP Basic, Digest e OAuth2, della documentazione tramite Swagger, etc. Nel capitolo è incluso un esempio dell’architettura middleware per lo sviluppo di API REST. Infine, viene presentato il progetto Apigility per lo sviluppo di API HTTP professionali in PHP.

Nel Capitolo 10 viene affrontato il tema della sicurezza. Sono presentati alcuni degli attacchi più famosi, riportati nella Top Ten 2017 del progetto OWASP. Vengono presi in esame attacchi SQL Injection, directory traversal, XSS, session fixation, CSRF, etc. Per ogni attacco è illustrato un possibile rimedio, come ad esempio l’utilizzo del Content Security Policy (CSP). Sono anche illustrate le tecniche per la protezione delle password, tramite gli algoritmi bcrypt, scrypt e Argon2. Viene inoltre illustrata la modalità di cifratura Authenticated Encryption (AE) e le funzioni di crittografia a chiave pubblica per autenticare e firmare digitalmente un documento.

Nel Capitolo 11 vengono introdotti alcuni dei design pattern più utilizzati nel mondo della programmazione a oggetti in PHP. Questo capitolo contiene anche un’introduzione alla Dependency Injection, argomento fondamentale per poter gestire la complessità delle moderne applicazioni web.

Nel Capitolo 12, l’ultimo del libro, vengono presentate le numerose novità della versione 7.3 e 7.4 di PHP. In particolare, con la versione 7.4 sono state aggiunte alcune funzionalità molto importanti come l’aggiunta dei tipi sulle proprietà di classe e la funzionalità di pre-caricamento (preloading). Inoltre, in questo capitolo ho presentato un benchmark per mettere a confronto le velocità di esecuzione di PHP a partire dalla versione 7.1 fino alla 7.4, non vi anticipo il risultato.

Gli argomenti presenti in questo libro sono tanti, in uno spazio a disposizione limitato. Per questo motivo ho inserito una ricca Bibliografia, con 77 riferimenti, per poter approfondire le varie tematiche introdotte e a volte solo accennate nel libro.

A chi è rivolto questo libro

Il linguaggio chiaro ed esaustivo rende questo libro utile ai neofiti che si avvicinano per la prima volta a PHP ma anche ai professionisti che utilizzano il linguaggio da anni.

Il sito dedicato a questo libro

Nel libro sono presentate prevalentemente tecnologie open source legate a PHP e allo sviluppo di applicazioni web. I codici sorgenti riportati in queste pagine sono stati testati su ambiente GNU/Linux ma possono essere utilizzati anche su Windows e Mac OS. Ho creato un sito dedicato al libro, raggiungibile all’indirizzo www.sviluppareinPHP7.it. In questo sito troverete numerose informazioni, alcune delle quali non presenti in queste pagine. Ad esempio, nel libro non è affrontato il tema dell’installazione di PHP, che troverete con numerosi dettagli nel sito.

Ringraziamenti

Desidero ringraziare il Prof. Giancarlo Ruffo dell’Università di Torino per la prefazione di questa seconda edizione. Desidero ringraziare l’ITS ICT Piemonte di Torino per avermi dato la possibilità di insegnare ai futuri programmatori e ringrazio soprattutto gli studenti che in questi ultimi anni mi hanno stimolato con le loro domande e curiosità. È proprio vero che il modo migliore per conoscere davvero qualcosa è provare a insegnarlo.

Per ultimo, ma non meno importante, desidero ringraziare nuovamente la community PHP internazionale che è da sempre per me una grande fonte di ispirazione e di stimolo.

1

Introduzione a PHP

“Badoo ha risparmiato un milione di dollari passando a PHP 7.”

Il Team di badoo.com

In questo capitolo verrà introdotto il linguaggio PHP presentando le sue caratteristiche principali e la sua evoluzione storica, dalle origini fino ai giorni nostri. PHP è uno dei linguaggi più utilizzati per lo sviluppo di applicazioni web. Nato nel 1995, oggi PHP è utilizzato da più dell’80% dei siti Internet di tutto il mondo. Realtà come Google, Facebook, Wikipedia e Yahoo fanno uso di questa tecnologia per lo sviluppo delle loro applicazioni.

Questa diffusione globale del linguaggio ha dato vita a una enorme community internazionale. In questo capitolo parleremo quindi dell’aspetto sociale di PHP, delle conferenze nazionali e internazionali e del ruolo dei PHP User Group. Partecipare agli eventi della community è infatti fondamentale per approfondire i temi del linguaggio e per conoscere di persona i professionisti che utilizzano o vogliono utilizzare questa tecnologia nei loro progetti.

Iniziamo il capitolo con un po’ di storia, dalla nascita del linguaggio fino alla versione attuale.

Storia ed evoluzione di PHP

PHP è un linguaggio di programmazione ideato per lo sviluppo di applicazioni web, nato nel 1995 per opera del programmatore danese Rasmus Lerdorf, che avviò questo progetto per avere uno strumento in grado di gestire l’interazione tra alcune semplici pagine web. Il termine PHP è l’acronimo ricorsivo di “PHP: Hypertext Preprocessor”, anche se in origine aveva il significato di “Personal Home Page Tools”.

La prima versione di PHP era costituita da una semplice collezione di script CGI (Common Gateway Interface) sviluppati nel linguaggio C. La seconda versione del linguaggio venne completamente riscritta da Lerdorf nel 1996 che, per l’occasione, aveva ridenominato il progetto in PHP/FI (Forms Interpreter). Solo a partire dalla versione 2.0 PHP inizia a prendere la forma di un vero linguaggio di programmazione, anche se la sua sintassi era molto diversa da quella attuale; di seguito è riportato un esempio:

<!--include /text/header.html-->

<!--getenv HTTP_USER_AGENT-->

<!--ifsubstr $exec_result Mozilla-->

Hey, you are using Netscape!<p>

<!--endif-->

<!--sql database select * from table where user='$username'-->

<!--ifless $numentries 1-->

Sorry, that record does not exist<p>

<!--endif exit-->

Welcome <!--$user-->!<p>You have <!--$index:0-->credits left in your account.<p>

<!--include /text/footer.html-->

Il codice PHP era inserito all’interno dei commenti in HTML. Questa soluzione poneva molti limiti, soprattutto dal punto di vista della sicurezza, poiché tutto il codice veniva inviato in chiaro. Questa versione del linguaggio aveva una natura decisamente prototipale. Le funzionalità, per lo più derivate dal linguaggio C, venivano aggiunte in maniera incrementale a seconda delle necessità. La mancanza di un solido design iniziale è stato un punto di criticità molto forte nell’esordio del linguaggio.

Nel 1997, due studenti dell’Università Technion di Haifa, Andi Gutmans e Zeev Suraski, per sviluppare un progetto universitario di e-commerce decidono di estendere il PHP/FI di Rasmus. Nasce così PHP 3, con l’utilizzo della sintassi odierna. Il nome del progetto PHP/FI si trasforma definitivamente in PHP: Hypertext Preprocessor. PHP 3 viene rilasciato nel 1998 e all’epoca si stima che il linguaggio fosse installato su più del 10% di tutti i server web del mondo. Il successo della versione 3 porta Gutmans e Suraski a riscrivere il motore del linguaggio ideando lo Zend Engine nel 1999, con un design più strutturato e un’architettura migliore. Nel frattempo i due studenti israeliani, ormai laureati, fondano la società Zend Technologies a Ramat Gan (Tel Aviv) per lavorare a tempo pieno sul linguaggio.

Dopo meno di due anni dall’uscita della versione 3, il 22 maggio del 2000 viene rilasciato PHP 4. Questa versione offre un primo supporto alla programmazione orientata agli oggetti (OOP). I programmatori PHP iniziano così a sviluppare le prime applicazioni web con l’utilizzo di classi e oggetti. Questo è sicuramente un punto di svolta dal punto di vista tecnologico. PHP inizia a diventare un vero e proprio linguaggio professionale, al pari di altri. Un’altra funzionalità interessante introdotta da questa versione è la Sessione, un meccanismo che consente di memorizzare informazioni sul server, associandole univocamente al visitatore. Il successo di PHP 4 dura per circa 8 anni, con l’ultima release 4.4.9 nell’agosto del 2008.

Nel luglio del 2004 viene rilasciata la prima versione di PHP 5 con l’utilizzo del nuovo motore Zen Engine 2. Le novità di questa versione sono tante, ad esempio il pieno supporto alla programmazione OOP e l’introduzione di PHP Data Objects (PDO), una classe per l’accesso ai database tramite un’unica API. Tra le novità più importanti c’è la velocità di esecuzione di PHP 5, migliorata notevolmente rispetto alla versione precedente.

Questa maturità del linguaggio, con il pieno supporto alla programmazione a oggetti e le performance migliorate, è la stata la svolta per la diffusione a livello enterprise di PHP. Sono nati infatti centinaia di progetti open source, dai framework di sviluppo ai Content Management Systems (CMS), alle applicazioni e-commerce, etc.

L’ultima versione del linguaggio è la 7, rilasciata il 3 dicembre 2015. Questa versione, dopo più di 10 anni dall’uscita della 5.0, rappresenta un ulteriore passo in avanti per PHP. Le performance sono state migliorate notevolmente, più del doppio rispetto a PHP 5.6, grazie a una riscrittura completa del sistema di gestione della memoria.

Molte sono le novità della versione 7, come il sistema per la gestione dei tipi di dati in ingresso e uscita delle funzioni, la possibilità di creare delle classi anonime, una nuova gerarchia delle eccezioni, etc. Avremo modo di vedere nel dettaglio tutte le novità di quest’ultima versione nel prosieguo del libro.

Ai lettori non sarà sfuggito il fatto che non abbiamo parlato di PHP 6. Di fatto questa versione non è mai stata rilasciata. Nel 2005 si è iniziato a parlare nella mailing list degli sviluppatori della necessità del supporto nativo Unicode. Alcuni hanno iniziato a implementare il supporto a questo standard ma il progetto non ha mai avuto termine. Questa funzionalità è stata per anni pubblicizzata come la novità della versione 6. Sono stati scritti anche interi libri su PHP 6, sperando in un rilascio di questa versione. Dopo anni di attese e incomprensioni, la community ha deciso di saltare la versione 6, per non creare ulteriore confusione. Ecco il motivo del salto da PHP 5 a PHP 7.

Licenza d’utilizzo

PHP è un linguaggio open source; ma cosa significa esattamente? Il termine open source è un termine generico che sta a indicare il libero accesso ai codici sorgenti. Le modalità specifiche per la ridistribuzione e l’utilizzo di un software open source sono riportate nella licenza di utilizzo. Esistono diverse tipologie di licenze. Una delle licenze più open è la GNU General Public License (GPL)¹, che prevede la totale libertà di utilizzo, a patto di rilasciare il software con la stessa licenza. La licenza GPL è alla base del movimento Free Software di Richard Stallman². Il preambolo del manifesto GPL inizia con questo incipit:

“Le licenze per la maggioranza dei programmi hanno lo scopo di togliere all’utente la libertà di condividerlo e di modificarlo. Al contrario, la GPL è intesa a garantire la libertà di condividere e modificare il free software, al fine di assicurare che i programmi siano “liberi” per tutti i loro utenti.”

PHP non è rilasciato con la licenza GPL, ritenuta troppo restrittiva per scopi commerciali, bensì con una sua apposita licenza, denominata PHP License, un derivato della Berkeley Software Distribution (BSD). L’ultima versione della PHP License è la 3.01, a firma del PHP Group, ossia degli sviluppatori del linguaggio. Con questa licenza è possibile distribuire liberamente i codici sorgenti e i binari del linguaggio a patto che:

• la PHP License sia sempre presente;

• il termine “PHP” non sia utilizzato nel titolo o nella descrizione di opere derivate;

• la seguente indicazione di copyright sia sempre inclusa:
“This product includes PHP software, freely available from <http://www.php.net/software/>”.

Questa licenza è stata approvata dalla Debian Free Software, dalla Free Software Foundation e dalla Open Source Initiative, ma non è compatibile con le licenze GPL e Copyleft a causa delle restrizioni sull’utilizzo del nome “PHP”.

Dal punto di vista del business, la PHP license garantisce un utilizzo libero e gratuito del linguaggio per lo sviluppo di applicazioni commerciali.

Oltre alla PHP License, è presente nel linguaggio un’altra licenza relativa all’utilizzo dello Zend Engine, l’interprete del linguaggio di cui parleremo diffusamente nel prosieguo del libro. Di fatto si tratta della stessa tipologia di licenza, con la differenza che il copyright è di proprietà della Zend Technologies Ltd. e l’utilizzo del termine “Zend” e “Zend Engine” è riservato e non può essere utilizzato senza autorizzazione scritta della suddetta società.

Per maggiori informazioni sulle licenze del linguaggio è possibile consultare la pagina ufficiale http://www.php.net/license.

Il logo e la mascotte di PHP

Nella Figura 1.1 è riportato il logo ufficiale del linguaggio.

Figura 1.1 - Il logo ufficiale di PHP.

La community PHP ha ideato negli anni la mascotte elePHPant, un elefante blu con il logo di PHP riportato sul lato, disegnato da Vincent Pontier (Figura 1.2).

Figura 1.2 - La mascotte elePHPant.

Esistono diverse versioni della mascotte elePHPant in peluche di diversi colori. Negli ultimi anni è nata la moda di personalizzare questi peluche a seconda delle conferenze o dei gruppi nati attorno al linguaggio (Figura 1.3). Sul sito www.elephpant.com è possibile acquistare un elePHPant, scegliendo taglia e colore.

Figura 1.3 - Una coppia di elePHPant.

L’interprete del linguaggio

PHP è un linguaggio interpretato, ossia il codice viene letto ed eseguito sul momento, leggendo le istruzioni in successione. L’interprete PHP è il componente che effettua la conversione del codice sorgente in codice binario, direttamente eseguibile dalla CPU di un elaboratore. Negli ultimi anni sono nati diversi interpreti PHP, come HHVM di Facebook (vedi [3] in Bibliografia), ma l’interprete storico del linguaggio è lo Zend Engine 2, sviluppato dalla società Zend Technologies.

Dal momento che il codice PHP è interpretato, risulta facilmente trasportabile su qualsiasi piattaforma. PHP è di fatto presente su tutti i sistemi operativi moderni: GNU/Linux, Microsoft Windows, Mac OS, IBM i, Aix, Android, Novell Netware, OS/2, RISC OS, SGI IRIX, Solaris, etc.

L’ultima versione del linguaggio è la 7.0 con un interprete tra i più veloci rispetto ad altri linguaggi come Perl, Ruby o Python (Figura 1.4). Dal grafico si evince che PHP 7.0 è due volte più veloce di Ruby 2.1, circa quattro volte più veloce di Python 2.7.8 e sette volte più veloce di Perl 5.18.4. Sono stati effettuati dei benchmark anche con Python 3 e PHP 7 è risultato il più veloce³.

Figura 1.4 - Esecuzione dell’algoritmo di Mandelbrot con i linguaggi PHP, Ruby, Python e Perl.

Una delle caratteristiche fondamentali del linguaggio è l’assenza di tipizzazione, ossia la possibilità di assegnare tipologie di dati differenti a una stessa variabile. Inoltre, le variabili non devono essere dichiarate preventivamente per poter essere utilizzate. Questa caratteristica rende il linguaggio molto snello e di immediato utilizzo, ma può anche portare a problemi, se non utilizzata correttamente. Il linguaggio offre comunque numerose funzioni che consentono di stabilire il tipo delle variabili e, a partire dalla versione 7, sono stati introdotti dei costrutti che consentono di specificare, ad esempio, il tipo delle variabili in ingresso e in uscita delle funzioni. Vedremo in maggior dettaglio questa caratteristica del linguaggio nel prosieguo del libro.