Sei sulla pagina 1di 54

PHP

La Retta Via.
Tweet

Ultimo Aggiornamento: 2015-11-30 18:23:37 +0000

Benvenuto
Traduzioni
Come contribuire
Spargi la voce!

Per iniziare
Usa l'attuale versione stabile (5.6)
Il Web server integrato
Configurazione Mac
Configurazione Windows

Stile di codifica
Caratteristiche del linguaggio
Paradigmi di programmazione
Namespace
Standard PHP Library
Interfaccia da linea di comando
Xdebug

Gestione delle dipendenze


Composer e Packagist

PEAR

Pratiche di codifica
Le basi
Data e ora
Design pattern
PHP e UTF-8

Iniezione delle dipendenze


Concetto di base
Problema complesso
Contenitore
Altre letture

Database
Estensione MySQL
Estensione PDO
Interagire coi database
Livelli di astrazione

Templating
Benefits
Plain Php Templates
Compiled Templates
Further Reading

Errori ed eccezioni
Errori
Eccezioni

Sicurezza

Sicurezza nelle applicazioni Web


Hashing delle password
Filtraggio dei dati
File di configurazione
Register globals
Segnalazione degli errori

Testing
Test Driven Development
Behavior Driven Development
Strumenti complementari

Server e pubblicazione
Platform as a Service (PaaS)
Server virtuali o dedicati
Server condivisi
Costruire e pubblicare la tua applicazione

Virtualizzazione
Vagrant
Docker

Caching
Opcode Cache
Caching degli oggetti

Documentare il tuo codice


PHPDoc

Risorse
Ufficiali
Persone da seguire

Mentoring
Provider PaaS PHP
Framework
Componenti
Altre risorse utili
Video tutorial
Libri

Community
User Groups
Conferences

Riconoscimenti

Benvenuto
Sul Web ci sono molte informazioni datate che portano gli utenti PHP fuori
strada, propagando cattive abitudini e
codice non sicuro. PHP: La Retta Via
una guida di riferimento veloce e facile da leggere contenente le migliori

tecniche di sviluppo PHP, gli standard popolari di scrittura del codice, link a
tutorial autorevoli sparsi per il Web e
quelle che secondo gli autori sono
attualmente le migliori pratiche.
Non c un solo modo corretto di usare PHP. Questo sito Web mira a presentare
ai nuovi sviluppatori PHP alcuni
argomenti che potrebbero non prendere mai in
considerazione, se non troppo tardi, e mira a fornire ai professionisti
alcune
idee fresche riguardo procedure che hanno usato per anni senza mai aggiornarle.
Questo sito Web inoltre non
ti dir mai quali strumenti usare, ma invece offrir
suggerimenti per opzioni multiple, spiegando le differenze
nellapproccio e nei
casi di utilizzo.
Questo un documento in sviluppo e continuer a essere aggiornato con nuove
informazioni utili ed esempi non
appena saranno disponibili.

Traduzioni
PHP: La Retta Via tradotto in molte lingue diverse:
Inglese
Bulgaro
Cinese (Semplificato)
Cinese (Tradizionale)

Francese
Tedesco
Indonesiano
Italiano
Giapponese
Coreano
Persiano
Polacco
Portoghese
Romeno
Russo
Serbo
Sloveno
Spagnolo
Thailandese
Turco
Ucraino

Come contribuire
Aiuta questo sito Web a diventare la migliore risorsa per i nuovi programmatori
PHP! Contribuisci su GitHub

Spargi la voce!
PHP: La Retta Via ha immagini banner che puoi usare sul tuo sito Web. Mostra
il tuo supporto e fai sapere ai nuovi
sviluppatori PHP dove possono trovare
buone informazioni.
Vedi banner
Torna su

Per iniziare
Usa lultima versione stabile (5.6)
Se hai appena iniziato con PHP assicurati di usare lultima versione stabile di
PHP 5.6. Il team di PHP ha aggiunto
nuove potenti
funzionalit negli ultimi anni. Nonostante la
differenza numerica tra 5.2 e 5.6 sia piccola, ci sono stati
dei cambiamenti
sostanziali. Se stai cercando una funzione o la sua modalit di utilizzo, la
documentazione sul sito
php.net avr la risposta.

Il Web server integrato


Con PHP 5.4 o successivo, puoi iniziare a studiare PHP senza installare e
configurare un web server completo. Per
avviare il server, esegui il seguente
comando dal terminale nella web root del tuo progetto:
> php -S localhost:8000

Impara a usare da linea di comando il Web server integrato

Configurazione Mac
OS X viene fornito con una versione pre-pacchettizzata di PHP, ma normalmente
un po pi vecchia dellultima
versione stabile. Mountain Lion ha la 5.3.10,
Mavericks ha la 5.4.17 e Yosemite ha la 5.5.9, ma con PHP 5.6 gi
rilasciato di
solito non abbastanza.
Ci sono diversi modi per installare PHP su OS X.

Installare PHP tramite Homebrew


Homebrew un potente gestore di pacchetti per OS X che pu
aiutarti a installare facilmente PHP e varie estensioni.
Homebrew PHP un
repository che contiene formule per Homebrew relative a PHP e ti permetter
di installare
PHP.
A questo punto, puoi installare php53 , php54 , php55 o php56 usando il
comando brew install e
cambiando la versione attiva modificando la variabile
PATH .

Installare PHP tramite Macports


Il progetto MacPorts uniniziativa della comunit open source per il design
di un sistema di semplice utilizzo per la
compilazione, linstallazione e
laggiornamento di software open source per linea di comando, X11 o Acqua sul

sistema operativo OS X.
MacPorts supporta i binari precompilati, quindi non devi ricompilare le
dipendenze dai sorgenti ogni volta. un
salvavita se non hai alcun pacchetto
installato sul sistema.
In questo momento puoi installare php53 , php54 , php55 o php56 usando il
comando port install . Per
esempio:
sudo port install php54
sudo port install php55

E puoi eseguire il comando select per cambiare la versione attiva di PHP:


sudo port select --set php php55

Installare PHP tramite phpbrew


phpbrew uno strumento per linstallazione e la gestione di versioni multiple
di PHP. Pu essere molto utile se due
applicazioni/progetti differenti
richiedono versioni differenti di PHP e non stai usando le macchine virtuali.

Compilare il sorgente
Unaltra opzione che ti fornisce controllo sulla versione di PHP che installi
compilarlo tu stesso. In questo caso
assicurati di avere
installato Xcode o il sostituto di Apple
Strumenti da riga di comando per XCode, scaricabile dal

Centro Sviluppatori
Mac di Apple.

Installatori all-in-one
Le soluzioni elencate sopra gestiscono principalmente solo PHP, e non forniscono
cose come Apache, Nginx o un
server SQL. Le soluzioni all-in-one come MAMP
e XAMPP installeranno questi altri software per te e li
integreranno
luno con laltro, ma la facilit dinstallazione compromette la flessibilit.

Configurazione Windows
Puoi installare PHP su Windows in diversi modi. Puoi scaricare i
binari e, fino a poco tempo fa, potevi usare un
installer
.msi. Linstaller non pi disponibile e si ferma a PHP 5.3.0.
Per lapprendimento e lo sviluppo locale puoi usare il webserver integrato in
PHP 5.4 e superiori, in modo da non
doverlo configurare. Se preferisci un
pacchetto all-in-one che include un webserver e MySQL, allora strumenti
come
Web Platform Installer, [Zend Server CE][zsce], XAMPP e
WAMP ti aiuteranno a configurare un ambiente di
sviluppo Windows in men
che non si dica. Detto questo, questi strumenti saranno diversi dallambiente di

produzione, quindi fai attenzione alle differenze se stai sviluppando su Windows


ma pubblicando su Linux.
Se devi far girare un ambiente di produzione su Windows, allora IIS7 ti fornir
quello pi stabile e performante. Puoi
usare phpmanager (un plugin
GUI per IIS7) per rendere pi semplice la configurazione e la gestione di PHP.
IIS7
integra gi FastCGI, devi solo configurare PHP come handler. Per supporto e
ulteriori informazioni, c unarea
dedicata a PHP su iis.net.
Torna su

Stile di codifica
La comunit PHP grande e diversificata, fatta di innumerevoli librerie,
framework e componenti. comune per gli
sviluppatori PHP scegliere diversi di
questi e combinarli in un singolo progetto. importante che il codice PHP

aderisca (il pi fedelmente possibile) a uno stile di codifica comune per


rendere facile agli sviluppatori mischiare e
usare diverse librerie nei loro
progetti.
Il Framework Interop Group ha proposto e approvato una serie di
raccomandazioni di stile. Non tutte riguardano lo
stile del codice, ma quelle
che lo riguardano sono note come PSR-0, PSR-1, PSR-2 e
PSR-4. Queste raccomandazioni
non sono che una lista di regole che
alcuni progetti come Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK,
FuelPHP,
Lithium etc. stanno iniziando ad adottare. Puoi usarle in uno dei tuoi progetti,
o continuare a usare il tuo
stile personale.
Idealmente dovresti scrivere codice PHP che aderisce ad uno standard noto. Pu
essere una qualunque combinazione
dei PSR o uno degli standard di codifica di
PHP o Zend. Questo significa che altri sviluppatori potranno facilmente
leggere
e lavorare col tuo codice, e le applicazioni che implementano i componenti
potranno essere consistenti anche
quando lavorano con molto codice di terze
parti.
Leggi il PSR-0
Leggi il PSR-1
Leggi il PSR-2
Leggi il PSR-4
Leggi i PEAR Coding Standards

Leggi i Symfony Coding Standards


Puoi usare PHP_CodeSniffer per controllare che il codice rispetti
queste raccomandazioni, e plugin per editor di testo
come
Sublime Text 2 per avere feedback in tempo reale.
Puoi sistemare la disposizione del codice automaticamente usando uno dei due
strumenti disponibili. Uno il PHP
Coding Standards Fixer di
Fabien Potencier, testato scrupolosamente. pi grande e pi lento, ma molto
stabile e
usato da alcuni grandi progetti come Magento e Symfony. Unaltra
opzione php.tools, reso popolare dal plugin per
editor
[sublime-phpfmt][sublime-phpmft]. Nonostante sia nuovo, porta molti
miglioramenti sotto il punto di vista
della performance, quindi ladattamento in
tempo reale nelleditor pi fluido.
La lingua inglese preferita per tutti i nomi di simboli e infrastrutture del
codice. I commenti possono essere scritti in
qualunque lingua facilmente
comprensibile da tutte le parti presenti e future che dovranno lavorare sul
codice.
Torna su

Caratteristiche del linguaggio


Paradigmi di programmazione
PHP un linguaggio flessibile e dinamico che supporta diverse tecniche di
programmazione. Si evoluto moltissimo
negli ultimi anni, in particolare
aggiungendo un solido modello a oggetti in PHP 5.0 (2004), le funzioni anonime e
i
namespace in PHP 5.3 (2009) e i trait in PHP 5.4 (2012).

Programmazione orientata agli oggetti


PHP ha un set molto completo di funzionalit riguardanti la programmazione
orientata agli oggetti inclusi il supporto
per le classi, le classi astratte, le
interfacce, lereditariet, i costruttori, la clonazione, le eccezioni e altro.
Leggi riguardo la programmazione orientata agli oggetti in PHP
Leggi riguardo i trait

Programmazione funzionale
PHP supporta le funzioni di prima classe, il che significa che una funzione pu
essere assegnata a una variabile. Ci si
pu riferire tramite variabili sia alle
funzioni definite dallutente che a quelle native, ed entrambe possono essere

invocate dinamicamente. Le funzioni possono essere passate ad altre funzioni


come argomenti (caratteristica
chiamata Funzioni di ordine superiore) e le
funzioni possono restituire altre funzioni.
La ricorsione, una caratteristica che permette a una funzione di chiamare se
stessa, supportata dal linguaggio, ma la
maggior parte del codice PHP
incentrato sulliterazione.
Le nuove funzioni anonime (con supporto per le chiusure) esistono da PHP 5.3
(2009).
PHP 5.4 ha aggiunto la possibilit di legare le chiusure allo scope di un
oggetto e ha migliorato il supporto per i
callback in modo che possano essere
usati quasi sempre in modo intercambiabile con le funzioni anonime.
Continua a leggere sulla Programmazione funzionale in PHP
Leggi sulle funzioni anonime

Leggi sulla classe Closure


Leggi lRFC sulle chiusure
Leggi sui callback
Leggi sulla chiamata dinamica alle funzioni con call_user_func_array

Metaprogrammazione
PHP supporta varie forme di metaprogrammazione tramite meccanismi come la
Reflection API e i metodi magici. Ci
sono diversi metodi magici disponibili come
__get() , __set() , __clone() , __toString() , __invoke()
etc. che
permettono agli sviluppatori di modificare il funzionamento di una classe. Gli
sviluppatori Ruby dicono
spesso che a PHP manca il metodo method_missing , ma
disponibile sotto il nome di __call() e
__callStatic() .
Leggi sui metodi magici
Leggi sulla Reflection API
Leggi sulloverloading

Namespace
Come menzionato sopra, la comunit PHP ha molti sviluppatori che creano molto
codice. Questo significa che il
codice PHP di una libreria potrebbe usare lo
stesso nome di unaltra per una classe. Quando entrambe le librerie
vengono
usate nello stesso namespace, potrebbero collidere e causare problemi.
I namespace risolvono questo problema. Come descritto nel manuale di PHP, si
pu pensare ai namespace come
directory del sistema operativo che dividono i
file; due file con lo stesso nome possono esistere in directory separate.
Allo
stesso modo, due classi PHP con lo stesso nome possono esistere in namespace PHP
separati. cos semplice.
importante inserire il codice in un namespace in modo che possa essere usato
da altri sviluppatori senza paura che
esso collida con altre librerie.
Nel dicembre 2013 il PHP-FIG ha creato un nuovo standard per lautoloading:
PSR-4, che un giorno probabilmente
rimpiazzer PSR-0. Attualmente
entrambi sono ancora utilizzabili, perch PSR-4 richiede PHP 5.3 e molti
progetti
che supportano solo PHP 5.2 attualmente implementano PSR-0. Se userai
un autoloader standard per una nuova
applicazione o pacchetto allora vorrai
quasi sicuramente dare unocchiata a PSR-4.
Un modo raccomandato di usare i namespace delineato nel [PSR-4], che mira a
fornire una convenzione standard
per la i nomi di file, classi e namespace, in
modo da consentire la scrittura di codice plug-and-play.
Nellottobre 2014 il PHP-FIG ha deprecato il precedente standard di autoloading,
PSR-0, che stato sostituito con
PSR-4. Attualmente entrambi
sono ancora utilizzabili, giacch PSR-4 richiede PHP 5.3 e molti progetti solo
per PHP
5.2 implementano attualmente PSR-0. Se hai intenzione di usare uno
standard di autoloading per una nuova
applicazione o pacchetto, probabilmente
PSR-4 la scelta giusta.
Leggi sui namespace
Leggi il PSR-0
Leggi il PSR-4

Standard PHP Library

La Standard PHP Library (SPL) distribuita con PHP e fornisce un insieme di


classi e interfacce. fatta
principalmente di strutture di dati di uso comune
(pile, code, cumuli etc.) e iteratori che possono navigare attraverso
queste
strutture o attraverso le tue classi che implementano le interfacce SPL.
Leggi sulla SPL
Video corso sulle SPL su Lynda.com (A pagamento)

Interfaccia da linea di comando


PHP stato creato per scrivere applicazioni Web, ma anche utile nella
creazione di programmi da linea di comando
(CLI). I programmi da linea di
comando aiutano ad automatizzare compiti come il testing, la pubblicazione e

lamministrazione dellapplicazione.
I programmi PHP CLI sono potenti perch puoi usare il codice della tua
applicazione direttamente, senza dover
creare una GUI sicura. Accertati solo di
non mettere gli script CLI nella root pubblica!
Prova ad eseguire PHP dalla tua linea di comando:
> php -i

Lopzione -i visualizzer la tua configurazione PHP proprio come la funzione


phpinfo.
Lopzione -a fornisce una shell interattiva, simile allIRB di Ruby o alla
shell interattiva di Python. Ci sono anche
altre opzioni utili.
Scriviamo un semplice programma Hello, $name. Per provarlo, crea un file
chiamato hello.php come
nellesempio.
<?php
if ($argc !== 2) {
echo "Utilizzo: php hello.php [name].\n";
exit(1);
}
$name = $argv[1];
echo "Hello, $name\n";

PHP imposta due variabili speciali a seconda degli argomenti con cui viene
eseguito il tuo script. $argc una variabile
intera contenente il
numero degli argomenti e $argv un array contenente il valore di
ciascun argomento. Il primo
argomento sempre il nome del tuo file PHP, in
questo caso hello.php .
Lespressione exit() usata con un numero diverso da zero per far sapere alla
shell che lesecuzione del comando
fallita. Codici di uscita comunemente usati
possono essere trovati qui.
Per eseguire lo script sopra dalla linea di comando:
> php hello.php
Utilizzo: php hello.php [nome]
> php hello.php world

Hello, world

Impara a eseguire PHP dalla linea di comando


Impara a configurare Windows per lesecuzione CLI

Xdebug
Uno degli strumenti pi utili nello sviluppo software un buon debugger. Ti
permette di tracciare lesecuzione del
codice e monitorare i contenuti dello
stack. Xdebug, il debugger di PHP, pu essere utilizzato da diversi IDE per

fornire punti di interruzione e ispezioni dello stack. Pu anche permettere a


strumenti come PHPUnit e
KCacheGrind di eseguire analisi della copertura del
codice e di profilatura.
Se ti trovi con le mani legate e utilizzando var_dump / print_r non riesci
ancora a trovare la soluzione, forse devi
usare il debugger.
Linstallazione di XDebug pu essere complessa, ma una delle
sue funzioni pi importanti il debug da remoto. Se
sviluppi codice localmente
e lo testi in una macchina virtuale o su un altro server, il debug da remoto
la funzione
che dovresti abilitare immediatamente.
Solitamente dovrai modificare il tuo virtual host o file .htaccess con questi
valori:
php_value xdebug.remote_host=192.168.?.?
php_value xdebug.remote_port=9000

Lopzione remote_host e remote_port corrispondono al tuo computer locale e


alla porta su cui fai ascoltare
lIDE. A questo punto si tratta solo di mettere
lIDE in modalit di ascolto e caricare lURL:
http://tuo-sito.example.com/index.php?XDEBUG_SESSION_START=1

Il tuo IDE intercetter lo stato attuale durante lesecuzione dello script,


permettendoti di impostare punti di
interruzione e ispezionare i valori in
memoria.
I debugger grafici rendono molto semplice navigare nel codice, ispezionare
variabili ed eseguire codice nel runtime
attivo. Molti IDE hanno il supporto
integrato o tramite plugin per il debugging grafico tramite Xdebug. MacGBDp

una GUI per Xdebug gratuita, open-source e stand-alone dedicata al Mac.


Impara a usare XDebug
Impara a usare MacGDBp
Torna su

Gestione delle dipendenze


Ci sono moltissime librerie PHP, framework e componenti tra cui scegliere. Il
tuo progetto, probabilmente, ne user
diversi. Queste sono dipendenze del
progetto. Fino a poco tempo fa, PHP non aveva un buon modo per gestire le

dipendenze del progetto. Anche se le gestivi manualmente, dovevi comunque


preoccuparti degli autoloader. Non pi.

Attualmente ci sono due grandi sistemi di gestione dei pacchetti per PHP:
Composer e PEAR. Composer il gestore
di pacchetti principale per PHP, ma
per lungo tempo PEAR ha ricoperto quel ruolo. Sapere cos PEAR una buona
idea
perch potresti trovare diversi riferimenti a esso, anche se non lo userai mai.

Composer e Packagist
Composer un ottimo gestore delle dipendenze per PHP. Elenca le dipendenze
del tuo progetto in un file
composer.json e, con pochi semplici comandi,
Composer scaricher automaticamente le dipendenze e imposter
lautoloading al
posto tuo.
Ci sono gi molte librerie PHP che sono compatibili con Composer pronte per
essere usate nel tuo progetto. Questi
pacchetti sono elencati su
Packagist, il repository ufficiale per le librerie PHP disponibili tramite
Composer.

Come installare Composer


Puoi installare Composer localmente (nella tua directory di lavoro; ma questo
non pi consigliato) o globalmente
(es. /usr/local/bin). Supponiamo tu lo
voglia installare localmente. Dalla directory root del tuo progetto:
curl -s https://getcomposer.org/installer | php

Questo scaricher composer.phar (un archivio PHP binario). Puoi eseguirlo con
php per gestire le dipendenze
del tuo progetto. Attenzione:
se esegui direttamente del codice proveniente dal Web, controllalo online per

assicurarti che sia sicuro.


Installazione su Windows
Per gli utenti Windows il modo pi facile di configurare tutto usare
linstaller [ComposerSetup][6], che esegue
uninstallazione globale e imposta la
variabile $PATH in modo che si possa chiamare composer nella linea di

comando da qualunque directory.

Come installare Composer (manualmente)


Linstallazione manuale di Composer una tecnica avanzata; tuttavia, ci sono
diverse ragioni per cui uno sviluppatore
potrebbe preferire questo metodo
rispetto alla procedura di installazione interattiva. Linstallazione
interattiva
controlla la tua versione di PHP per assicurarsi che:
una versione di PHP adatta sia in uso
i file .phar possano essere eseguiti correttamente
certe directory abbiano permessi sufficienti
certe estensioni problematiche non siano caricate
certe opzioni siano presenti nel php.ini
Poich uninstallazione manuale non esegue alcuno di questi controlli, dovrai
decidere se il lavoro vale la pena. Ecco
come installare Composer manualmente:
curl -s https://getcomposer.org/composer.phar -o $HOME/local/bin/composer
chmod +x $HOME/local/bin/composer

La directory $HOME/local/bin (o una directory di tua scelta) dovrebbe essere


nella variabile di ambiente $PATH .
In questo modo il comando composer sar
disponibile.
Quando incontri documentazione che dice di eseguire Composer con php
composer.phar install , puoi sostituirlo
con:
composer install

Questa sezione presumer che tu abbia installato composer globalmente.

Come definire e installare dipendenze


Composer tiene traccia delle dipendenze del tuo progetto in un file chiamato
composer.json . Puoi gestirlo
manualmente se preferisci, o usare lo stesso
Composer. Il comando composer require aggiunge una dipendenza
del progetto e,
se non hai un file composer.json , lo crea. Ecco un esempio che aggiunge
Twig come dipendenza del
tuo progetto:
composer require twig/twig:~1.8

In alternativa puoi usare il comando composer init , che ti guider nella


creazione di un file composer.json per
il tuo progetto. In ogni caso, una
volta che hai creato il file composer.json , puoi dire a Composer di scaricare
e
installare le dipendenze nella cartella vendors/ . Questo vale anche per i
progetti che hai scaricato e che forniscono
un file composer.json :
composer install

Adesso, aggiungi questa linea al file principale della tua applicazione PHP;
questo dir a PHP di usare lautoloader di
Composer per le dipendenze del tuo
progetto.
<?php
require 'vendor/autoload.php';

Ora puoi usare le dipendenze del tuo progetto, che saranno caricate
automaticamente quando richieste.

Aggiornare le dipendenze
Composer crea un file chiamato composer.lock che contiene la versione esatta
di ogni pacchetto che ha scaricato
durante lesecuzione di php composer.phar
install . Se condividi il tuo progetto con altre persone e il file

composer.lock parte della distribuzione, quando eseguiranno php


composer.phar install otterranno le tue
stesse versioni. Per aggiornare le
dipendenze, esegui php composer.phar update .
Questo particolarmente utile quando definisci i tuoi requisiti di versione in
maniera flessibile. Per esempio, un
requisito di ~1.8 significa qualunque
versione dopo la 1.8.0 , ma minore di 2.0.x-dev . Puoi anche usare il

carattere jolly * (es. 1.8.* ). Ora il comando di Composer php composer.phar


update aggiorner le
dipendenze alla versione pi recente che soddisfa i
requisiti definiti.

Notifiche di aggiornamento
Per ricevere notifiche riguardo release di nuove versioni puoi registrati a
VersionEye, un servizio web che pu
monitorare i tuoi account GitHub e
BitBucket alla ricerca di file composer.json e mandare email con le nuove

release dei pacchetti.

Controllare la presenza di vulnerabilit nelle tue dipendenze


Il Security Advisories Checker un web service e uno strumento da linea di
comando. Entrambi esamineranno il file
composer.lock e ti diranno se devi
aggiornare le tue dipendenze.

Gestire le dipendenze globali con Composer


Composer pu anche gestire le dipendenze globali e i loro binari. Luso
semplice, tutto quello che devi fare
aggiungere il prefisso global al
comando. Se per esempio volessi installare PHPUnit globalmente, eseguiresti il

seguente comando:
composer global require phpunit/phpunit

Questo creer una cartella ~/.composer contenente le tue dipendenze globali.


Per rendere disponibili ovunque i
binari dei pacchetti, dovrai solo aggiungere
la cartella ~/.composer/vendor/bin alla tua variabile $PATH .
Impara a usare Composer

PEAR
Un altro gestore di pacchetti storico che molti sviluppatori PHP amano
PEAR. Si comporta pi o meno come
Composer, ma presenta alcune differenze
che bene conoscere.
PEAR richiede che ogni pacchetto abbia una struttura specifica, il che significa
che lautore del pacchetto deve
prepararlo per lutilizzo con PEAR. Usare un
progetto che non stato preparato per lutilizzo con PEAR non
possibile.
PEAR installa i pacchetti globalmente, il che significa che dopo la prima
installazione essi diventano disponibili per
tutti i progetti su quel server.
Questa pu essere una buona cosa se molti progetti utilizzano la stessa versione
dello
stesso pacchetto, ma pu portare a problemi se si creano conflitti di
versione tra due progetti.

Come installare PEAR


Puoi installare PEAR scaricando linstaller .phar ed eseguendolo. La
documentazione di PEAR ha istruzioni
dinstallazione dettagliate per ogni
sistema operativo.
Se stai usando Linux, puoi anche dare unocchiata al gestore di pacchetti della
tua distribuzione. Debian e Ubuntu,
per esempio, hanno un pacchetto APT
php-pear .

Come installare un pacchetto


Se un pacchetto elencato nella lista di pacchetti PEAR, puoi installarlo
specificando il suo nome ufficiale:

pear install foo

Se il pacchetto hostato su un altro canale, dovrai prima scoprire il canale e


specificarlo durante linstallazione. Vedi
la documentazione sulluso dei
canali per pi informazioni su questo argomento.
Impara a usare PEAR

Gestire le dipendenze PEAR con Composer


Se stai gi usando Composer e vorresti installare del codice PEAR, puoi
usare Composer per gestire le tue dipendenze
PEAR. Questo esempio installer
codice da pear2.php.net :
{
"repositories": [
{
"type": "pear",
"url": "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_Text_Markdown": "*",
"pear-pear2/PEAR2_HTTP_Request": "*"
}
}

La prima sezione "repositories" verr usata per far sapere a Composer che deve
inizializzare (o scoprire nella
terminologia PEAR) il repository PEAR. Poi
nella sezione require viene aggiunto un prefisso al nome del pacchetto,
cos:
> pear-channel/Package

Il prefisso pear fisso per evitare conflitti, poich un canale PEAR potrebbe
essere identico al nome del distributore
di altri pacchetti. In questo modo il
nome del canale (o lURL completo) pu essere usato per riferirsi al canale in
cui
si trova il pacchetto.
Il codice installato viene messo nella directory vendors/ ed automaticamente
disponibile tramite lautoloader di
Composer:

vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php
Per usare questo pacchetto PEAR scrivi semplicemente:
<?php
$request = new pear2\HTTP\Request();

Impara a usare PEAR con Composer


Torna su

Pratiche di codifica
Le basi
PHP un linguaggio vasto che permette a programmatori di ogni livello di
produrre codice non solo velocemente, ma
efficientemente. Tuttavia, avanzando
nellapprendimento del linguaggio, ci scordiamo spesso le basi che abbiamo

imparato (o su cui abbiamo sorvolato) in favore di scorciatoie e/o cattive


pratiche. Per aiutare a combattere questo
male comune, questa sezione mira a
ricordare ai programmatori delle pratiche di codifica di base in PHP.
Continua a leggere Le basi

Data e ora
PHP ha una classe chiamata DateTime che aiuta nella lettura, scrittura,
confronto e calcolo di date e ore. Non ci sono
molte funzioni relative alle date
e allora in PHP a parte DateTime, ma essa fornisce una interfaccia orientata
agli
oggetti ai casi di uso pi comuni. Pu gestire i fusi orari, ma ci esula
da questa breve introduzione.
Per iniziare a lavorare con DateTime, converti le rappresentazioni grezze di
date e ora in un oggetto con il metodo
createFromFormat() o esegui
new \DateTime per ottenere la data e lora attuali. Usa il metodo format()
per
convertire DateTime in una stringa da visualizzare.
<?php
$raw = '22. 11. 1968';
$start = DateTime::createFromFormat('d. m. Y', $raw);
echo 'Data inizio: ' . $start->format('Y-m-d') . "\n";

Il calcolo con DateTime possibile grazie alla classe DateInterval. DateTime ha


dei metodi come add() e sub()
che prendono un DateInterval per argomento.
Non scrivere codice che presume ci sia lo stesso numero di secondi in
ogni
giorno, sia lora legale che i cambiamenti nel fuso orario altereranno i
risultati. Invece usa gli intervalli di data.
Per calcolare la differenza tra
date usa il metodo diff() . Restituir un nuovo DateInterval, che molto
facile da
visualizzare.
<?php
// crea una copia di $start e aggiungi un mese e 6 giorni
$end = clone $start;
$end->add(new DateInterval('P1M6D'));
$diff = $end->diff($start);
echo 'Differenza: ' . $diff->format('%m mese, %d giorni (total: %a giorni)') . "\n";
// Differenza: 1 mese, 6 giorni (total: 37 giorni)

Sugli oggetti DateTime possibile eseguire un confronto standard:

<?php
if ($start < $end) {
echo "L'inizio prima della fine!\n";
}

Un ultimo esempio per dimostrare lutilizzo della classe DatePeriod. Viene usata
per iterare su eventi ricorrenti. Pu
prendere due oggetti DateTime, inizio e
fine, e lintervallo per il quale restituir tutti gli eventi compresi.
<?php
// mostra tutti i gioved tra $start e $end
$periodInterval = \DateInterval::createFromDateString('first thursday');
$periodIterator = new \DatePeriod($start, $periodInterval, $end,
\DatePeriod::EXCLUDE_START_DATE);
foreach ($periodIterator as $date) {
// visualizza ogni data nel periodo
echo $date->format('Y-m-d') . ' ';
}

Leggi su DateTime
Leggi sulla formattazione delle date (opzioni di formato delle date accettate)

Design pattern
Quando stai costruendo la tua applicazione daiuto usare dei pattern di
progettazione del tuo codice e pattern
comuni per la struttura
complessiva del tuo progetto. Usare pattern comuni utile perch rende molto
pi facile
gestire il tuo codice e permette ad altri sviluppatori di capire
velocemente come tutti i componenti lavorano tra loro.
Se usi un framework la maggior parte del codice di alto livello e la struttura
del tuo progetto saranno basati su quel
framework, quindi molte delle decisioni
riguardanti i pattern vengono fatte al posto tuo. Ma comunque una tua
scelta
quella dei migliori pattern da seguire nel codice che crei appoggiandoti a quel
framework. Se, daltra parte, non
stai usando un framework per creare la tua
applicazione allora dovrai trovare i pattern che si adattano meglio al tipo
e
alle dimensioni dellapplicazione che stai costruendo.
Continua a leggere i Design pattern

Lavorare con UTF-8


Questa sezione stata originariamente scritta da
Alex Cabal
su PHP Best Practices ed stata usata
come base per i
nostri consigli su UTF-8.

Non c una soluzione unica. Sii attento, dettagliato e consistente.


Attualmente PHP non supporta Unicode al basso livello. Ci sono dei modi per
assicurarsi che le stringhe UTF-8
vengano processate correttamente, ma non
semplice, ed necessario scavare in quasi tutti i livelli dellapplicazione

web, dallHTML allSQL al PHP. Cercheremo di scrivere un sommario breve e


pratico.

UTF-8 al livello PHP


Le operazioni di base con le stringhe, come il concatenamento di due stringhe e
lassegnamento di stringhe a variabili,
non richiedono nulla di speciale per il
supporto UTF-8. Tuttavia la maggior parte delle funzioni per le stringhe, come

strpos() e strlen() , richiedono particolare considerazione. Queste funzioni


hanno solitamente una
controparte mb_* : per esempio, mb_strpos() e
mb_strlen() . Queste stringhe mb_* vengono fornite tramite
lEstensione
Multibyte String, e sono specificatamente disegnate per operare su stringhe
Unicode.
Devi usare le funzioni mb_* ogni qualvolta operi su una stringa Unicode. Per
esempio, se usi substr() su una
stringa UTF-8, c una buona possibilit che
il risultato includa dei caratteri incomprensibili. La funzione corretta da

usare sarebbe la controparte multibyte, mb_substr() .


La parte difficile ricordarsi di usare le funzioni mb_* ogni volta. Se ti
dimentichi anche una sola volta, la tua
stringa Unicode rischia di divenire
incomprensibile durante le operazioni successive.
Non tutte le funzioni per le stringhe hanno una controparte mb_* . Se non ce
n una per quello che vuoi fare, allora
peggio per te.
Inoltre, dovresti usare la funzione mb_internal_encoding() allinizio di ogni
script PHP che scrivi (o in cima al tuo
script incluso globalmente), e la
funzione mb_http_output() subito dopo se il tuo script invia dati a un
browser.
Definire esplicitamente la codifica delle tue stringhe in ogni script
ti salver molti futuri mal di testa.
Infine, molte funzioni PHP che operano sulle stringhe hanno un parametro
opzionale che ti permette di specificare la
codifica dei caratteri. Dovresti
sempre esplicitamente indicare UTF-8 quando ne hai la possibilit. Per esempio,

htmlentities() ha unopzione per la codifica dei caratteri, e dovresti sempre


specificare UTF-8 se hai a che fare
con certe stringhe. Tieni a mente che, a
partire da PHP 5.4.0, UTF-8 la codifica predefinita per htmlentities() e

htmlspecialchars() .
Infine, se stai costruendo unapplicazione distribuita e non sei certo che
lestensione mbstring sar disponibile,
considera lidea di usare il pacchetto
Composer patchwork/utf8. Questo user mbstring se disponibile, e le

funzioni non UTF-8 se non lo .

UTF-8 al livello database


Se il tuo script PHP accede a MySQL, possibile che le tue stringhe vengano
salvate nel database come stringhe non
UTF-8 anche se segui tutte le precauzioni
di cui sopra.
Per assicurarti che le tue stringhe vadano da PHP a MySQL come UTF-8, assicurati
che il set e la collation di caratteri
del tuo database e delle tue tabelle
siano impostati a utf8mb4 , e usa il set di caratteri utf8mb4 nella stringa
di
connessione PDO. Vedi lesempio di codice sotto. Questo estremamente
importante.
Tieni a mente che devi usare il set di caratteri utf8mb4 per il supporto
completo a UTF-8, non il set di caratteri
utf8 ! Vedi Ulteriori letture per
scoprire perch.

UTF-8 al livello browser


Usa la funzione mb_http_output() per assicurarti che il tuo script PHP invii
stringhe UTF-8 al tuo browser.
Il browser avr poi bisogno di sapere dalla risposta HTTP che questa pagina
devessere considerata come UTF-8.
Lapproccio storico usare il <meta> tag
charset nel tag <head> della
tua pagina. Questo approccio perfettamente
valido, ma impostare il charset
nellheader Content-Type in realt
molto pi veloce.

<?php
// Comunica a PHP che useremo stringhe UTF-8 fino alla fine dello script
mb_internal_encoding('UTF-8');
// Comunica a PHP che invieremo stringhe UTF-8 al browser
mb_http_output('UTF-8');
// La nostra stringa UTF-8 di test
$string = 'l sla erin l e-govaned vn.';
// Trasforma la stringa in qualche modo con una funzione multibyte
// Nota come, a scopo dimostrativo, tagliamo la stringa a un carattere non ASCII
$string = mb_substr($string, 0, 15);
<<<<<<< HEAD
// Connettiti al database per salvare la stringa trasformata
// Vedi l'esempio PDO in questo documento per maggiori informazioni
// Nota il comando `set names utf8mb4`!
$link = new \PDO(
'mysql:host=tuo-hostname;dbname=tuo-db;charset=utf8mb4',
'tuo-username',
'tua-password',
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_PERSISTENT => false
)
);
// Salva la stringa trasformata come UTF-8 nel nostro database
// Il tuo DB e le tabelle usano il set e la collation di caratteri utf8mb4, giusto?
$handle = $link->prepare('insert into FrasiElviche (Id, Body) values (?, ?)');
$handle->bindValue(1, 1, PDO::PARAM_INT);
$handle->bindValue(2, $string);
$handle->execute();
// Recupera la stringa che abbiamo appena memorizzato per provare che stata salvata
correttamente
$handle = $link->prepare('select * from FrasiElviche where Id = ?');
$handle->bindValue(1, 1, PDO::PARAM_INT);
$handle->execute();
// Salva il risultato in un oggetto che dopo invieremo nel nostro HTML
$result = $handle->fetchAll(\PDO::FETCH_OBJ);
header('Content-Type: text/html; charset=UTF-8');
?><!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Pagina di test UTF-8</title>
</head>

<body>
<?php
foreach($result as $row){
print($row->Body);

// Questo dovrebbe inviare correttamente la nostra stringa

UTF-8 trasformata al browser


}
?>
</body>
</html>

Ulteriori letture
PHP Manual: String Operations
PHP Manual: String Functions
strpos()
strlen()
substr()

PHP Manual: Multibyte String Functions


mb_strpos()
mb_strlen()
mb_substr()
mb_internal_encoding()
mb_http_output()
htmlentities()
htmlspecialchars()

PHP UTF-8 Cheatsheet


Handling UTF-8 with PHP
Stack Overflow: What factors make PHP Unicode-incompatible?
Stack Overflow: Best practices in PHP and MySQL with international strings
How to support full Unicode in MySQL databases
Bringing Unicode to PHP with Portable UTF-8
Stack Overflow: DOMDocument loadHTML does not encode UTF-8 correctly
Torna su

Iniezione delle dipendenze


Da Wikipedia:

Liniezione delle dipendenze un design pattern della programmazione software


che
permette la rimozione di dipendenze cablate a codice e rende possibile
cambiarle, durante
lesecuzione o la compilazione.
Questa citazione fa sembrare il concetto molto pi complicato di quanto sia in
realt. Liniezione delle dipendenze
consiste nel fornire a un componente le sue
dipendenze tramite liniezione nel costruttore, chiamate a metodi, o

limpostazione di propriet. Tutto qui.

Concetto di base

Possiamo dimostrare il concetto con un esempio semplice ma primitivo.


Abbiamo una classe Database che richiede un adattatore per comunicare col
database. Istanziamo un adattatore
nel costruttore e creiamo una dipendenza
cablata a codice. Questo rende il testing difficoltoso e la classe Database

fortemente legata alladattatore.


<?php
namespace Database;
class Database
{
protected $adapter;
public function __construct()
{
$this->adapter = new MySqlAdapter;
}
}
class MysqlAdapter {}

Questo codice pu essere rifattorizzato in modo che usi liniezione delle


dipendenze, e dunque renda la dipendenza
pi elastica.
<?php
namespace Database;
class Database
{
protected $adapter;
public function __construct(MySqlAdapter $adapter)
{
$this->adapter = $adapter;
}
}
class MysqlAdapter {}

Ora forniamo alla classe Database la sua dipendenza invece di crearla noi.
Potremmo anche creare un metodo che
accetti un argomento della dipendenza e
impostarla cos, o se la propriet $adapter fosse public potremmo
impostarla
direttamente.

Problema complesso
Se hai mai letto qualcosa sulliniezione delle dipendenze allora hai
probabilmente visto i termini Inversione del
controllo o Principio di
inversione della dipendenza. Questi sono problemi complessi risolti
dalliniezione delle
dipendenze.

Inversione del controllo


Linversione del controllo consiste, come suggerisce il nome, nellinvertire il
controllo di un sistema tenendo il
controllo organizzativo completamente
separato dai nostri oggetti. Con liniezione delle dipendenze, questo significa

rendere le dipendenze pi flessibili controllandole e istanziandole in un altro


punto del sistema.
Per anni, i framework PHP hanno usato linversione del controllo. Tuttavia, la
domanda diventata: quale parte del
controllo stai invertendo, e dove? Per
esempio, i framework MVC generalmente fornivano un oggetto padre o un
controller
di base che gli altri controller dovevano estendere per accedere alle sue
dipendenze. Questa inversione
del controllo, ma invece di rendere le
dipendenze pi flessibili, questo metodo semplicemente le spostava.
Liniezione delle dipendenze ci permette di risolvere questo problema in maniera
pi elegante, iniettando solo le
dipendenze che ci servono, quando ci servono,
senza il bisogno di alcuna dipendenza rigida.

Principio di inversione della dipendenza


Il principio di inversione della dipendenza la D nellinsieme di principi di
design orientato agli oggetti S.O.L.I.D.,
secondo cui si dovrebbe Dipendere
dalle astrazioni. Non dipendere dalle concrezioni. Detto semplicemente,
questo
significa che le nostre dipendenze dovrebbero essere interfacce/contratti o
classi astratte, non
implementazioni concrete. Possiamo facilmente
rifattorizzare lesempio sopra in modo che segua questo principio.
<?php
namespace Database;
class Database
{
protected $adapter;
public function __construct(AdapterInterface $adapter)
{
$this->adapter = $adapter;
}
}
interface AdapterInterface {}
class MysqlAdapter implements AdapterInterface {}

Ci sono diversi benefici allapproccio seguito, in cui la classe Database


dipende ora da uninterfaccia piuttosto che
da unimplementazione concreta.
Pensa di lavorare in team, e che un collega stia lavorando alladattatore. Nel
nostro primo esempio, avremmo dovuto
aspettare che tale collega finisse
ladattore prima di poterlo imitare appropriatamente per i nostri unit test. Ora
che la
dipendenza uninterfaccia/contratto, possiamo felicemente imitare
quellinterfaccia sapendo che il nostro collega
costruir ladattatore basandosi
su quel contratto.
Un beneficio ancora pi grande che ora il nostro codice molto pi scalabile.
Se tra un anno decidiamo che
vogliamo migrare verso un tipo diverso di database,
possiamo scrivere un adattatore che implementi linterfaccia
originale e
iniettare quello. Non servirebbe alcunaltra rifattorizzazione, perch saremmo
sicuri che ladattore segue il
contratto stabilito dallinterfaccia.

Contenitore
La prima cosa che dovresti capire riguardo i contenitori di iniezione delle
dipendenze che non sono uguali
alliniezione delle dipendenze. Un contenitore
unutilit che ti aiuta a implementare liniezione delle dipendenze.
Tuttavia,
possono essere (e spesso sono) usati male per implementare un anti-pattern, la
localizzazione dei servizi.
Iniettare nelle tue classi un contenitore DI come un
localizzatore di servizi crea una dipendenza dal contenitore
ancora pi forte di
quella che stai sostituendo. Inoltre rende il tuo codice molto meno trasparente
e pi difficile da
testare.
La maggior parte dei framework moderni ha il proprio contenitore di iniezione
delle dipendenze che ti permette di
unire insieme le dipendenze tramite
configurazione. Questo significa che puoi scrivere del codice applicativo pulito
e
indipendente quanto il framework su cui basato.

Altre letture
Learning about Dependency Injection and PHP
What is Dependency Injection?
Dependency Injection: An analogy
Dependency Injection: Huh?
Dependency Injection as a tool for testing
Torna su

Database
Molte volte il tuo codice PHP utilizzer un database per memorizzare
informazioni. Hai diverse opzioni per
connetterti e interagire con il tuo
database. Lopzione consigliata fino a PHP 5.1.0 era di usare i driver
nativi come
mysqli, pgsql, mssql etc.
I driver nativi vanno bene se usi un database nella tua applicazione ma se,
per esempio, stai usando MySQL e un po
di MSSQL, o devi connetterti a un
database Oracle, allora non potrai usare gli stessi driver. Dovrai imparare una

nuova API per ogni database e pu diventare faticoso.

Estensione MySQL
Lestensione mysql per PHP non pi attivamente sviluppata ed
ufficialmente deprecata a partire da PHP 5.5.0, il
che
significa che sar rimossa nei prossimi rilasci. Se nelle tue applicazioni stai
usando delle funzioni che iniziano
con mysql_* come mysql_connect() o
mysql_query() , sappi che nelle versioni successive semplicemente non
saranno
pi disponibili. Questo significa che sarai obbligato a riscrivere il tuo codice
a un certo punto, quindi
lopzione migliore rimpiazzare mysql con mysqli o
PDO secondo la tua tabella di marcia; in questo modo dopo non
dovrai farlo in
fretta e furia.
Se stai iniziando ora, non usare assolutamente lestensione mysql: usa
lestensione MySQLi o PDO.
PHP: Scegliere una API per MySQL
Tutorial PDO per sviluppatori MySQL

Estensione PDO
PDO una libreria di astrazione della connessione al database (integrata in
PHP a partire dalla versione 5.1.0) che
fornisce uninterfaccia comune per la
comunicazione con molti database differenti. Per esempio, puoi usare

praticamente lo stesso codice per interfacciarti con MySQL o SQLite:


<?php
// PDO + MySQL
$pdo = new PDO('mysql:host=example.com;dbname=database', 'utente', 'password');
$statement = $pdo->query("SELECT un_campo FROM una_tabella");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['un_campo']);
// PDO + SQLite
$pdo = new PDO('sqlite:/path/db/foo.sqlite');
$statement = $pdo->query("SELECT un_campo FROM una_tabella");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['un_campo']);

PDO non tradurr le tue query SQL e non emuler le funzionalit mancanti; viene
usato solo per connettersi a diversi
tipi di database con la stessa API.
Ancora pi importante, PDO ti permette di inserire in maniera sicura dellinput
esterno (es. ID) nelle tue query SQL
senza preoccuparti di attacchi di tipo SQL
injection. possibile farlo grazie agli statement e ai bound parameters di
PDO.
Supponiamo che uno script PHP riceva un ID numerico come parametro della query.
Questo ID dovrebbe essere
usato per recuperare il record di un utente dal
database. Ecco il modo sbagliato di farlo:
<?php
$pdo = new PDO('sqlite:/path/db/utenti.db');
$pdo->query("SELECT nome FROM utenti WHERE id = " . $_GET['id']); // <-- NO!

Questo codice terribile. Stai inserendo direttamente un parametro della query


in una query SQL. Questa
vulnerabilit sar sfruttata in un batter docchio,
usando una pratica chiamata SQL Injection. Immagina solo cosa
accadrebbe se un
hacker passasse un parametro id fittizio chiamadno un URL come
http://domain.com/?
id=1%3BDELETE+FROM+users . In questo modo la variabile
$_GET['id'] sarebbe impostata a 1;DELETE FROM
users , che cancellerebbe tutti
i tuoi utenti! Per evitarlo, dovresti sempre pulire linput ID usando i bound

parameters di PDO.
<?php
$pdo = new PDO('sqlite:/path/db/utenti.db');
$stmt = $pdo->prepare('SELECT nome FROM utenti WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- filtra prima i tuoi
dati (vedi [Filtraggio dei dati](#data_filtering)), in particolare per operazioni INSERT,
UPDATE etc.
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- Pulito automaticamente da PDO

$stmt->execute();

Questo codice corretto. Usa un bound parameter in uno statement PDO. In questo
modo viene effettuato lescape
dellinput esterno ID prima che questo venga
introdotto nel database, evitando potenziali attacchi di tipo SQL
injection.
Per le operazioni di scrittura, come INSERT e UPDATE, particolarmente
importante filtrare prima i dati e poi
pulirli (rimozione di
tag HTML, JavaScript etc.). PDO li pulir solo rispetto allSQL, non alla tua
applicazione.
Impara a usare PDO
Dovresti anche tenere in considerazione che le connessioni al database usano
risorse, e non sarebbe strano che tali
risorse si esaurissero se le connessioni
non vengono chiuse implicitamente (ma pi comune in altri linguaggi).
Usando
PDO, puoi chiudere implicitamente la connessioni distruggendo loggetto, ovvero
assicurandoti che tutti i
rimanenti riferimenti a esso vengano cancellati
(impostati a NULL). Se non lo fai esplicitamente, PHP chiuder
automaticamente
la connessione quando il tuo script termina lesecuzione, a meno che,
ovviamente, tu non stia
usando delle connessioni persistenti.
Impara a usare le connessioni PDO

Interagire coi database


Quando gli sviluppatori iniziano a studiare PHP, spesso finiscono per mescolare
linterazione col database con la
logica di presentazione, usando codice come
questo:
<ul>
<?php
foreach ($db->query('SELECT * FROM tabella') as $row) {
echo "<li>".$row['campo1']." - ".$row['campo2']."</li>";
}
?>
</ul>

Questo una pessima pratica per diverse ragioni: principalmente difficile da


debuggare, difficile da testare, difficile
da leggere e stamper molti campi se
non imposti un limite.
Nonostante ci siano molte soluzioni per farlo - a seconda che si preferisca
lOOP o la
programmazione funzionale - ci
devessere un
elemento di separazione.
Considera il passo pi semplice:
<?php
function getAllFoos($db) {
return $db->query('SELECT * FROM tabella');
}
foreach (getAllFoos($db) as $row) {
echo "<li>".$row['campo1']." - ".$row['campo2']."</li>";
}

Questo un buon inizio. Metti quei due pezzi in due file diversi e hai una
separazione pulita.
Crea una classe per metterci quel metodo e hai un modello. Crea un semplice
file .php per metterci la logica di
presentazione e hai una vista, che
molto simile allMVC - unarchitettura OOP comune a molti
framework.
foo.php
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'utente', 'password');
// Rendi disponibile il tuo modello
include 'models/FooModel.php';
// Crea un'istanza
$foo = new FooModel($db);
// Effettua la query attraverso un metodo pubblico
$fooList = $foo->getAllFoos();
// Mostra una vista
include 'views/foo-list.php';

models/FooModel.php
<?php
class FooModel()
{
protected $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function getAllFoos() {
return $this->db->query('SELECT * FROM tabella');
}
}

views/foo-list.php
<?php foreach ($fooList as $row): ?>
<?= $row['campo1'] ?> - <?= $row['campo2'] ?>
<?php endforeach ?>

Questa essenzialmente la stessa cosa che fanno molti framework moderni, anche
se un po pi manuale. Potresti
non averne sempre bisogno, ma mischiare insieme
troppa logica di presentazione e interazione col database pu

essere un problema
serio se vorrai mai fare lo unit testing della tua
applicazione.
PHPBridge ha unottima risorsa chiamata Creating a Data Class che copre un
argomento simile, ed perfetta per
sviluppatori che stanno prendendo
famigliarit solo ora col concetto di interazione coi database.

Livelli di astrazione
Molti framework forniscono il proprio livello di astrazione, che a volte
basato su PDO. Spesso questi emulano in un
sistema di database funzionalit
presenti solo in un altro, fornendoti dei metodi PHP per costruire le tue query;
in
questo modo forniscono unastrazione reale del database invece della semplice
astrazione della connessione fornita
da PDO. Ovviamente, questo complica
leggermente le cose, ma se stai costruendo unapplicazione portatile che deve

funzionare con MySQL, PostgreSQL e SQLite, allora un po di complicazione pu


essere introdotta per avere del
codice pulito.
Alcuni livelli di astrazione sono stati costruiti usando gli standard di
namespace PSR-0 o PSR-4, in modo che possano
essere installati
in qualunque applicazione:
Aura SQL
Doctrine2 DBAL
Propel
ZF2 Db
Torna su

Templating
I template sono un modo comodo per separare la logica dei controller e quella di
dominio dalla logica di
presentazione. Tipicamente i template contengono il
codice HTML della tua applicazione, ma possono essere usati
anche per altri
formati, come lXML. I template vengono spesso chiamati anche viste, che
costituiscono parte del
secondo componente del pattern di architettura del
software modelviewcontroller
(MVC).

Benefici
Il beneficio principale derivante dalluso dei template la separazione che
creano tra la logica di presentazione e il
resto della tua applicazione. I
template hanno la sola responsabilit di visualizzare contenuto formattato. Non
sono
responsabili per il recupero o la persistenza dei dati o altri compiti pi
complessi. Questo porta alla scrittura di
codice pi pulito e pi facile da
leggere, particolarmente utile in un team dove gli sviluppatori lavorano sul
codice
server-side (controller e modelli) e i designer lavorano sul client-side
(markup).
I template, inoltre, migliorano lorganizzazione del codice di presentazione. I
template sono generalmente posti in
una cartella views, ciascuno definito in
un singolo file. Questo approccio incoraggia il riutilizzo del codice: grandi

blocchi di codice vengono spezzati in pezzi pi piccoli e riutilizzabili, spesso


chiamati template o viste parziali
(partials). Per esempio, lheader e il
footer del tuo sito possono essere definiti ciascuno in un template e venire poi

inclusi prima e dopo ciascun template di pagina.


Infine, a seconda della libreria che usi, i template possono offrire maggiore
sicurezza eseguendo lescape automatico
del contenuto generato dallutente.
Alcune librerie offrono anche una funzionalit di sand-boxing: in questo caso i

designer dei template hanno accesso solo a variabili e funzioni autorizzate.

Template PHP semplici


I template scritti in PHP sono semplicemente dei template che usano codice PHP
nativo. Sono una scelta naturale
dato che PHP stesso un linguaggio per i
template. Questo significa semplicemente che puoi includere codice PHP in
altro
codice, come lHTML. Si tratta di un beneficio per gli sviluppatori PHP perch
non c nessuna nuova sintassi
da imparare, conoscono le funzioni disponibili, e
i loro editor PHP hanno gi levidenziazione della sintassi e

lautocompletamento integrati. Inoltre, i template PHP sono generalmente molto


veloci perch non richiedono
compilazione.
Ogni framework PHP moderno utilizza qualche tipo di sistema di template, la
maggior parte dei quali usano PHP di
default. Al di l dei framework, librerie
come Plates o Aura.View semplificano il lavoro con i template
PHP offrendo
funzionalit di templating moderne come lereditariet, i layout e
le estensioni.

Esempio semplice di template PHP


Usando la libreria Plates.
<?php // user_profile.php ?>
<?php $this->insert('header', ['title' => 'Profilo utente']) ?>
<h1>Profilo utente</h1>
<p>Ciao, <?=$this->escape($name)?></p>
<?php $this->insert('footer') ?>

Esempio di template PHP con ereditariet


Usando la libreria Plates.
<?php // template.php ?>
<html>
<head>
<title><?=$title?></title>
</head>
<body>
<main>
<?=$this->section('content')?>
</main>
</body>
</html>

<?php // user_profile.php ?>

<?php $this->layout('template', ['title' => 'Profilo utente']) ?>


<h1>Profilo utente</h1>
<p>Ciao, <?=$this->escape($name)?></p>

Template compilati
Nonostante PHP si sia evoluto fino a diventare un linguaggio maturo e orientato
agli oggetti, non migliorato molto
come
linguaggio di templating. I template compilati, come Twig o Smarty*,
sopperiscono a questa mancanza
offrendo una nuova sintassi che stato studiata
appositamente per il templating. Dallescaping automatico
allereditariet,
passando per le strutture di controllo semplificate, i template compilati sono
disegnati per essere pi
semplici da scrivere, pi puliti da leggere e pi
sicuri da usare. I template compilati possono anche essere condivisi
tra diversi
linguaggi, e Mustache ne un buon esempio. Poich questi template devono
essere compilati c un
leggero impatto sulla performance, ma minimo quando si
usa un sistema di caching appropriato.
*Nonostante Smarty offra lescaping automatico, questa funzionalit NON
abilitata di default.

Esempio semplice di template compilato


Usando la libreria Twig.
{% include 'header.html' with {'title': 'Profilo utente'} %}
<h1>Profilo utente</h1>
<p>Ciao, {{ name }}</p>
{% include 'footer.html' %}

Esempio di template compilato che usa lereditariet


Usando la libreria Twig.
// template.html
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<main>
{% block content %}{% endblock %}
</main>
</body>
</html>

// user_profile.html
{% extends "template.html" %}
{% block title %}Profilo utente{% endblock %}
{% block content %}
<h1>Profilo utente</h1>
<p>Ciao, {{ name }}</p>
{% endblock %}

Ulteriori letture
Articoli e tutorial
Templating Engines in PHP
An Introduction to Views & Templating in CodeIgniter
Getting Started With PHP Templating
Roll Your Own Templating System in PHP
Master Pages
Working With Templates in Symfony 2

Librerie
Aura.View (nativo)
Blade (compilato, specifico per il framework)
Dwoo (compilato)
Latte (compilato)
Mustache (compilato)
PHPTAL (compilato)
Plates (nativo)
Smarty (compilato)
Twig (compilato)
Zend\View (nativo, specifico per il framework)
Torna su

Errori ed Eccezioni
Errori
In molti linguaggi di programmazione, ogni volta che qualcosa va storto viene
lanciata uneccezione. Questo
certamente un modo possibile di fare le cose, ma
PHP un linguaggio con poche eccezioni. Nonostante supporti le
eccezioni e
sempre pi del codice nativo stia usando a usarle quando si lavora con gli
oggetti, la maggior parte di PHP
cercher di continuare a processare
indipendentemente da quello che accade, a meno che non avvenga un errore
fatale.
Per esempio:

$ php -a
php > echo $foo;
Notice: Undefined variable: foo in php shell code on line 1

Questo solo un errore notice, e PHP continuer felicemente. Questo pu


confondere chi viene da linguaggi con
molte eccezioni, perch riferirsi a una
variabile mancante in Python, per esempio, lancia uneccezione:
$ python
>>> print foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined

Lunica vera differenza che Python andr nel panico per ogni piccola cosa, in
modo che gli sviluppatori possano
essere completamente sicuri che qualunque
potenziale problema o caso limite sia coperto, mentre PHP continuer a

processare a meno che non avvenga qualcosa di estremo; a questo punto lancer un
errore e lo riporter.

Gravit degli errori


PHP ha diversi livelli di gravit degli errori. I tre tipi pi comuni di
messaggi sono gli errori, i notice e i warning.
Questi hanno diversi livelli di
gravit: E_ERROR , E_NOTICE e E_WARNING . Gli errori sono errori fatali che

avvengono durante lesecuzione; sono solitamente causati da problemi nel tuo


codice e devono essere sistemati
perch impediranno lesecuzione di PHP. I
notice sono messaggi di avviso causati da codice che potrebbe o meno
causare
problemi durante lesecuzione dello script; lesecuzione non viene fermata. I
warning sono errori non fatali:
lesecuzione dello script non viene fermata.
Un altro tipo di messaggio di errore riportato durante la compilazione sono i
messaggi E_STRICT . Questi messaggi
sono usati per suggerire cambiamenti al tuo
codice per assicurare la migliore interoperabilit e compatibilit con le

versioni successive di PHP.

Cambiare il metodo di segnalazione degli errori in PHP


Il segnalazione degli errori pu essere cambiato usando le impostazioni di PHP
e/o delle chiamate a funzioni PHP.
Usando la funzione nativa di PHP
error_reporting() puoi impostare il livello degli errori per la durata

dellesecuzione dello script passando una delle costanti di livello errore


predefinite. Questo significa che se vuoi
vedere solo warning ed errori - ma non
notice - allora puoi configurarlo cos:
<?php
error_reporting(E_ERROR | E_WARNING);

Puoi anche controllare se gli errori vengono visualizzati a schermo (ottimo per
lo sviluppo) o se vengono nascosti e
loggati (ottimo per la produzione). Per
maggiori informazioni controlla la sezione
Segnalazione degli errori.

Soppressione in linea degli errori


Puoi anche dire a PHP di sopprimere errori specifici usando loperatore di
controllo degli errori @ . Metti questo
operatore allinizio di unespressione,
e ogni errore che un risultato diretto dellespressione viene silenziato:

<?php
echo @$foo['bar'];

Questo mostrer $foo['bar'] se esiste, ma restituir semplicemente un valore


nullo e non visualizzer niente se la
variabile $foo o lindice 'bar' non
esistono. Senza loperatore di controllo degli errori, questa espressione

potrebbe creare un errore PHP Notice: Undefined variable: foo o PHP Notice:
Undefined index: bar .
Questa potrebbe sembrare una buona idea, ma ci sono alcuni lati negativi. PHP
gestisce le espressioni che usano un
@ in maniera meno performante rispetto a
quelle senza @ . Lottimizzazione prematura potrebbe essere la radice
di tutti
i dibattiti sulla programmazione, ma se la performance particolarmente
importante per la tua
applicazione/libreria, importante capire le conseguenze
che loperatore di controllo degli errori avr sulla
performance.
In secondo luogo, loperatore di controllo degli errori inghiotte
completamente lerrore. Lerrore non viene
mostrato, e lerrore non viene
mandato al log degli errori. Inoltre, i sistemi PHP di produzione non hanno modo
di
disabilitare loperatore di controllo degli errori. Nonostante lerrore che
vedi potrebbe essere innocuo, un errore
differente e meno innocuo verrebbe
ugualmente silenziato.
Se c un modo di evitare loperatore di soppressione degli errori, dovresti
consdierarlo. Per esempio, il nostro codice
sopra potrebbe essere riscritto
cos:
<?php
echo isset($foo['bar']) ? $foo['bar'] : '';

Un caso in cui la soppressione degli errori potrebbe avere senso quando


fopen() non trova il file da caricare.
Potresti controllare lesistenza del
file prima di provare a caricarlo, ma se il file viene cancellato dopo il
controllo e
prima di fopen() (il che potrebbe sembrare impossibile, ma pu
accadere) allora fopen() restituir false e
lancer un errore. Questo
potenzialmente qualcosa che PHP dovrebbe risolvere, ma un caso in cui la
soppressione
degli errori potrebbe sembrare lunica soluzione valida.
Prima abbiamo detto che non c modo in un sistema PHP tradizionale di
disabilitare loperatore di controllo degli
errori. Tuttavia, Xdebug ha
unimpostazione ini xdebug.scream che disabilita loperatore di controllo
degli errori.
Puoi impostarlo nel tuo php.ini scrivendo:
xdebug.scream = On

Puoi anche impostare questo valore durante lesecuzione con la funzione ini_set :
<?php
ini_set('xdebug.scream', '1')

Lestensione PHP Scream offre una funzionalit simile a quella di Xdebug, ma


limpostazione ini di Scream si
chiama scream.enabled .
Questo particolarmente utile quando stai debuggando del codice e sospetti che
un messaggio di errore informativo
venga soppresso. Usa scream con cura, come
uno strumento di debugging temporaneo. Ci sono molte librerie PHP
che potrebbero
non funzionare con loperatore di controllo degli errori disabilitato.

Operatori di controllo degli errori


SitePoint
Xdebug
Scream

ErrorException
PHP perfettamente in grado di essere un linguaggio fortemente orientato alle
eccezioni, e richiede solo qualche
linea di codice per fare il cambio.
Fondamentalmente puoi lanciare i tuoi errori come eccezioni usando la classe

ErrorException , che estende la classe Exception .


Questa una pratica comune implementata da un grande numero di framework
moderni come Symfony e Laravel. Di
default Laravel visualizzer tutti gli errori
e le eccezioni usando il pacchetto Whoops! se linterruttore app.debug

acceso, oppure li nasconder se linterruttore spento.


Lanciando gli errori come eccezioni durante lo sviluppo puoi gestirli meglio del
solito, e se vedi uneccezione durante
lo sviluppo puoi racchiuderla
in unistruzione di cattura con codice specifico per gestire la situazione.
Ciascuna
eccezione che catturi rende istantaneamente la tua applicazione un po
pi robusta.
Maggiori informazioni su questo e su come usare la classe ErrorException per
gestire gli errori si possono trovare
su classe ErrorException.
Operatori di controllo degli errori
Costanti predefinite per la gestione degli errori
error_reporting()

Segnalazione degli errori

Eccezioni
Le eccezioni sono una parte standard della maggior parti dei linguaggi di
programmazione famosi, ma sono spesso
ignorate dai programmatori PHP. Linguaggi
come Ruby fanno un uso massiccio delle eccezioni, quindi ogni volta che
qualcosa
va storto come una richiesta HTTP che fallisce, o una query al database che non
funziona, o anche se
unimmagine non pu essere trovata, Ruby (o le gem usate)
lancer uneccezione a schermo in modo che tu sappia
subito che c un errore.
PHP stesso piuttosto negligente in questo senso: una chiamata a
file_get_contents() su un file inesistente non
far che restituire FALSE e
un warning. Molti vecchi framework PHP come CodeIgniter si limiteranno a
restituire
false, loggare un messaggio nei loro log proprietari e a volte usare
un metodo come $this->upload->get_error()
per vedere cos andato storto. Il
problema qui che devi cercare lerrore e controllare la documentazione per
vedere
come recuperare lerrore di quella classe, invece di averlo subito ovvio.
Un altro problema quando le classi lanciano un errore a schermo
automaticamente e terminano il processo.
Facendo questo, impedisci a un altro
sviluppatore di gestire dinamicamente lerrore. Le eccezioni dovrebbero essere

lanciate per mettere a conoscenza lo sviluppatore di un errore; star a loro


scegliere come gestirlo. Esempio:
<?php
$email = new Fuel\Email;
$email->subject('Mio oggetto');
$email->body('Come stai?');

$email->to('guy@example.com', 'Un tizio');


try
{
$email->send();
}
catch(Fuel\Email\ValidationFailedException $e)
{
// La validazione fallita
}
catch(Fuel\Email\SendingFailedException $e)
{
// Il driver non riuscito a mandare l'email
}
finally
{
// Eseguito anche se l'eccezione non stata lanciata, e prima che la normale esecuzione
riprenda
}

Eccezioni SPL
La classe generica Exception fornisce molte poche informazioni di debug per lo
sviluppatore; tuttavia, per
rimediare a questo, possibile creare una versione
specializzata di Exception estendola:
<?php
class ValidationException extends Exception {}

Questo significa che puoi aggiungere pi blocchi catch e gestire differenti


eccezioni in modo differente. Questo pu
portare alla creazione di
molte eccezioni personalizzate, alcune delle quali avrebbero potuto
essere evitate usando le
eccezioni SPL fornite dallestensione SPL.
Se per esempio usi il metodo magico __call() e un metodo non valido
richiesto, invece di lanciare uneccezione
standard, troppo vaga, o creare
uneccezione personalizzata solo per quello, potresti solo eseguire throw new

BadFunctionCallException() .
Leggi sulle eccezioni
Leggi sulle eccezioni SPL
Nidificare le eccezioni in PHP
Migliori pratiche per le eccezioni in PHP 5.3
Torna su

Sicurezza
Sicurezza nelle applicazioni Web

Ci sono cattive persone pronte e desiderose di manipolare la tua applicazione


Web. importante che prendi le
precauzioni necessarie per irrigidire la
sicurezza della tua applicazione Web. Fortunatamente, i ragazzi
dellOpen
Web Application Security Project hanno compilato una lunga lista
di vulnerabilit di sicurezza note e metodi per
proteggerti contro di esse.
Questa guida devessere necessariamente letta da qualunque sviluppatore che
abbia a cura
la sicurezza.
Leggi la guida di sicurezza OWASP

Hashing delle password


Prima o poi chiunque crea unapplicazione PHP che richiede il login degli
utenti. Username e password vengono
salvati nel database e usati successivamente
per autenticare gli utenti al login.
importante effettuare un hashing appropriato delle password prima di
salvarle. Lhashing delle password una
funzione irreversibile che viene
eseguita sulle password degli utenti. Essa produce una stringa a lunghezza fissa
che
non pu essere decriptata. Ci significa che puoi confrontare lhash con un
altro per determinare se provengono tutti
dalla stessa stringa dorigine, ma non
puoi determinare la stringa di origine. Se lhashing delle password non viene

effettuato e il tuo database letto da una persona non autorizzata, tutti gli
account utente sono compromessi. Alcuni
utenti potrebbero (sfortunatamente)
usare la stessa password per altri servizi. Dunque, importante gestire la

sicurezza seriamente.
In PHP 5.5 stata introdotta la funzione password_hash . In questo momento
utilizza lalgoritmo BCrypt, che il
pi potente attualmente supportato da PHP.
Sar aggiornata in futuro per supportare altri algoritmi. La libreria

password_compat stata creata per fornire compatibilit per PHP >= 5.3.7.
Nellesempio sotto calcoliamo lhash di una stringa, quindi confrontiamo lhash
con una nuova stringa. Poich le
nostre stringhe di origine sono differenti
(secret-password e bad-password) questo login fallir.
<?php
require 'password.php';
$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);
if (password_verify('bad-password', $passwordHash)) {
// password corretta
} else {
// password sbagliata
}

Impara a usare password_hash()


password_compat for PHP >= 5.3.7 && < 5.5
Scopri il ruolo della crittografia nellhashing
RFC della funzione PHP password_hash()

Filtraggio dei dati


Non fidarti mai (mai!) dellinput esterno introdotto nel tuo codice PHP.
Sanitizza e valida sempre linput prima di
usarlo nel tuo codice. Le funzioni
filter_var e filter_input possono sanitizzare il testo e validare certi


formati (es. indirizzi email).
Linput esterno pu essere qualunque cosa: dati di form da $_GET e $_POST ,
alcuni valori nella variabile
superglobale $_SERVER , e il corpo della
richiesta HTTP recuperato tramite fopen('php://input', 'r') .
Ricorda, linput
esterno non limitato ai form inviati dallutente. Anche i file caricati e
scaricati, i valori di sessione, i
dati nei cookie e i dati da servizi Web di
terze parti sono input esterno.
Anche se linput esterno pu essere salvato, combinato e letto successivamente,
ancora input esterno. Ogni volta che
processi, visualizzi, concateni o includi
dati nel tuo codice, chiediti se sono stati filtrati appropriatamente e se ci si

pu fidare di essi.
I dati possono essere filtrati diversamente a seconda del loro scopo. Per
esempio, quando input esterno non filtrato
passato nelloutput HTML della
pagina, pu esguire codice HTML e JavaScript sul tuo sito! Questo conosciuto

come Cross-Site Scripting (XSS) e pu essere un attacco molto pericoloso. Un


modo per evitare lXSS sanitizzare
tutti i dati generati dallutente prima di
visualizzarlo nella tua pagina, rimuovendo i tag HTML con la funzione

strip_tags o eseguendo lescape di caratteri dal significato speciale nelle


loro rispettive entit HTML con le
funzioni htmlentities o htmlspecialchars .
Un altro esempio il passaggio di opzioni alla linea di comando. Questo pu
essere molto pericoloso (ed
solitamente una cattiva idea), ma puoi usare la
funzione nativa escapeshellarg per sanitizzare gli argomenti del
comando
eseguito.
Un ultimo esempio laccettazione di input esterno per determinare un file da
caricare dal filesystem. Questa
vulnerabilit pu essere sfruttata cambiando il
nome di file in un path di file. Devi rimuovere /, ../, i byte nulli o

altri caratteri dal path in modo che non possa caricare file nascosti, non
pubblici o con informazioni sensibili.
Impara a filtare i dati
Impara a usare filter_var
Impara a usare filter_input
Impara a gestire i byte nulli

Sanitizzazione
La sanitizzazione rimuove (o fa lescape) i caratteri non permessi o pericolosi
dallinput esterno.
Per esempio, dovresti sanitizzare linput esterno prima di includerlo in codice
HTML o inserirlo in una query SQL
grezza. Quando usi i parametri di
PDO, esso sanitizzer linput per te.
A volte richiesto di consnetire alcuni tag HTML sicuri nellinput quando
viene incluso nella pagina HTML. Questo
molto difficile da fare e molti lo
evitano usando una formattazione pi ristretta come Markdown o BBCode, tuttavia

esistono alcune librerie come HTML Purifier per svolgere questo


compito.
Vedi i filtri di sanitizzazione

Validazione
La validazione serve per assicurarsi che linput esterno contenga ci che ti
aspetti. Per esempio, potresti voler validare
un indirizzo email, un numero di
telefono o unet quando processi una richiesta di registrazione.
Vedi i filtri di validazione

File di configurazione
Nella creazione di file di configurazione per la tua applicazione, le migliori
pratiche raccomandano lutilizzo di uno
dei seguenti metodi:
consigliato salvare le informazioni di configurazioni dove non possono
essere lette direttamente tramite il file
system
Se devi salvare i tuoi file di configurazione nella root pubblica, chiama i
file con estensione .php . Questo
assicura che, anche se uno script
eseguito direttamente, non sar visualizzato come testo semplice.
Le informazioni nei file di configurazione dovrebbero essere protette
appropriatamente, tramite crittografia o
permessi del filesystem per
gruppo/utente

Register globals
NOTA: A partire da PHP 5.4.0 lopzione register_globals stata rimossa e
non pu pi essere usata. Questo
incluso solo come avvertimento per chiunque
stia aggiornando una vecchia applicazione.
Quando abilitata, lopzione register_globals far s che molti tipi di
variabili (incluse quelle da $_POST ,
$_GET e $_REQUEST ) siano disponibili
nello scope globale dellapplicazione. Questo pu facilmente portare a
problemi
di sicurezza, perch la tua applicazione non pu stabilire con certezza da dove
arrivano i dati.
Per esempio: $_GET['foo'] sarebbe disponibile tramite $foo , che pu
sovrascrivere le variabili non dichiarate.
Se stai usando PHP < 5.4.0,
assicurati che register_globals sia off.
register_globals nel manuale PHP

Segnalazione degli errori


Il logging degli errori pu essere utile per trovare i punti problematici della
tua applicazione, ma pu anche esporre
informazioni riguardo la sua struttura al
mondo esterno. Per proteggere efficacemente la tua applicazione da
problemi che
potrebbero essere causati dalla visualizzazioni di questi messaggi, devi
configurare il tuo server
diversamente negli ambienti di sviluppo e produzione.

Sviluppo
Per mostrare ogni possibile errore durate lo sviluppo,
configura le seguenti opzioni nel tuo php.ini :
display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On

Il valore -1 visualizzer ogni possibile errore, anche quando nuovi livelli


verranno
aggiunti in versioni future di PHP. Anche la costante E_ALL si
comporta in questo modo a
partire da PHP 5.4. -
php.net

Il livello di errore E_STRICT stato introdotto nella versione 5.3.0 e non


parte di E_ALL , tuttavia lo diventato
nella 5.4.0. Questo significa che se
vuoi segnalare ogni possibile errore nella 5.3 devi usare -1 o
E_ALL |
E_STRICT .
Segnalare ogni possibile errore nelle diverse versioni di PHP
< 5.3 -1 o E_ALL
5.3 -1 o E_ALL | E_STRICT
> 5.3 -1 o E_ALL

Produzione
Per nascondere gli errori in produzione configura cos il tuo
php.ini :
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

Con queste impostazioni in produzione, gli errori saranno comunque loggati nei
log del web server, ma non saranno
visualizzati allutente. Per maggiori
informazioni su queste impostazioni, vedi il manuale di PHP:
error_reporting
display_errors
display_startup_errors
log_errors
Torna su

Testing
Scrivere test automatizzati per il tuo codice PHP considerata una buona
pratica e pu portare a unapplicazione ben
costruita. I test automatizzati sono
un ottimo strumento per assicurarsi che la tua applicazione non si rompa quando

cambi qualcosa o aggiungi una nuova funzionalit e non dovrebbero essere


ignorati.
Ci sono diversi tipi di strumenti (o framework) per il testing in PHP, ciascuno
con un approccio differente; tutti
quanti cercano di evitare la necessit di
testare manualmente e di assemblare grandi team per il Controllo Qualit
solo
per assicurarsi che i recenti cambiamenti non rompano funzionalit esistenti.

Test Driven Development


Da Wikipedia:

Il Test Driven Development, in sigla TDD (in italiano: Sviluppo guidato dalle
verifiche) un
processo di sviluppo del software in cui lo sviluppo vero e
proprio preceduto (e guidato,
driven) dalla stesura di test automatici. Il
processo si articola sulla ripetizione di brevi cicli
di sviluppo e collaudo
(noti come cicli TDD, TDD cycles) suddivisi in tre fasi successive,


sintetizzate dal motto Red-Green-Refactor.
Ci sono molti modi diversi di testare la tua applicazione.

Unit testing
Lo unit testing un approccio di programmazione usato per assicurarsi che
funzioni, classi e metodi funzionino come
ci si aspetta durante lintero ciclo
di sviluppo. Controllando i valori di input e output delle funzioni e dei
metodi, puoi
accertarti che la logica interna funzioni correttamente. Usando
liniezione delle dipendenze e creando classi mock e
stub puoi verificare che le
dipendenze vengano usate correttamente per una copertura dei test ancora
migliore.
Quando crei una classe o funzione dovresti creare uno unit test per ogni
comportamento che deve assumere. Come
minimo dovresti assicurarti che generi un
errore se le invii argomenti non validi e che funzioni se le invii argomenti

validi. Questo aiuter ad assicurarsi che, quando cambi qualcosa in questa


classe o funzione successivamente nel
ciclo di sviluppo, la vecchia
caratteristica continuer a funzionare come previsto. Lunica alternativa a
questo sarebbe
var_dump() in un file test.php, il che non un modo corretto per
creare unapplicazione, sia piccola che grande.
Laltro utilizzo per gli unit test nel contributo a progetti open source. Se
riesci a scrivere un test che mostra una
caratteristica non funzionante, lo
sistemi e mostri che ora il test passa, le patch saranno accettate molto pi

facilmente. Se hai intenzione di lanciare un progetto che accetta contributi


esterni, questo dovrebbe essere un
requisito.
PHPUnit lo standard de-facto per la scrittura di unit
test per applicazioni PHP, ma ci sono diverse alternative:
atoum
Enhance PHP
PUnit
SimpleTest

Integration testing
Da Wikipedia:

Lintegration testing (a volte chiamato Integration and Testing, abbreviato


I&T) la fase
del testing software in cui i moduli individuali vengono
combinati e testati come un
insieme. Si piazza dopo lo unit testing e prima
del validation testing. Lintegration testing
prende come input moduli su cui
gi stato effettuato unit testing, li raggruppa in
aggregati pi grandi,
applica i test definiti nel piano di integration testing a questi
aggregati e
invia come output il sistema integrato, pronto per lesecuzione del system

testing.
Molti degli strumenti per lo unit testing possono essere usati anche per
lintegration testing, giacch molti dei principi
di base sono gli stessi.

Functional testing
A volte conosciuto anche come acceptance testing, il functional testing consiste
nellutilizzo di strumenti per la
creazione di test automatizzati che usino
realmente la tua applicazione invece di limitarsi a verificare che unit

individuali di codice si comportino correttamente e riescano a parlare luna con


laltra. Questi strumenti funzionano
generalmente utilizzando dati reali e
simulati utenti dellapplicazione esistenti.

Strumenti per il functional testing


Selenium
Mink
Codeception un framework completo che include
strumenti di acceptance testing
Storyplayer un framework completo
per il testing che include il supporto per la creazione e la distruzione di

ambienti di test su richiesta

Behavior Driven Development


Ci sono due differenti tipi di Behavior-Driven Development (BDD): SpecBDD e
StoryBDD. Lo SpecBDD si concentra
sul comportamento tecnico del codice, mentre
lo StoryBDD si concentra sulle interazioni. PHP ha dei framework per
entrambi i
tipi di BDD.
Con lo StoryBDD, scrivi delle storie leggibili da esseri umani che descrivono il
comportamento della tua applicazione.
Queste storia possono poi essere eseguite
come veri e propri test per la tua applicazione. Il framework usato nelle

applicazioni PHP per lo StoryBDD Behat, che si ispira al progetto Ruby


Cucumber e implementa il DSL Gherkin
per la descrizione delle funzionalit.
Con lo SpecBDD, scrivi delle specifiche che descrivono come il tuo codice
dovrebbe funzionare. Invece di testare una
funzione o un metodo, descrivi come
quella funzione o metodo dovrebbero comportarsi. PHP offre il framework
PHPSpec
per questo scopo. Questo framework si ispira al progetto Ruby RSpec.

Link sul BDD


Behat, il framework StoryBDD per PHP, ispirato al progetto Ruby Cucumber;
PHPSpec, il framework SpecBDD per PHP, ispirato al progetto Ruby RSpec;
Codeception un framework di testing completo che adotta i principi BDD;

Strumenti complementari
Oltre ai framework di testing individuali, ci sono anche altri framework
generici e librerie di aiuto utili per ogni
approccio.

Link agli strumenti


Selenium uno strumento di automazione del browser che pu essere integrato
con PHPUnit
Mockery un Mock Object Framework che pu essere integrato con PHPUnit o
PHPSpec
Prophecy un framework PHP per il mocking di oggetti molto discusso, ma
molto potente e flessibile.
integrato con PHPSpec e pu essere usato con
PHPUnit.
Torna su

Server e pubblicazione
Le applicazioni PHP possono essere pubblicate ed eseguite sui Web server di
produzione in diversi modi.

Platform as a Service (PaaS)

PaaS fornisce il sistema e larchitettura di rete necessari per eseguire


applicazioni PHP in Rete. Questo significa che
c bisogno di poca o nessuna
configurazione per lanciare applicazioni e framework PHP.
Recentemente PaaS diventato un metodo piuttosto usato per la pubblicazione,
lhosting e la scalatura di
applicazioni PHP di ogni dimensione. Puoi trovare
una lista di provider PHP PaaS Platform as a Service
nella
nostra sezione risorse.

Server virtuali o dedicati


Se hai dimestichezza con lamministrazione di un sistema o vuoi impararla, i
server virtuali o dedicati ti danno totale
controllo sullambiente di produzione
della tua applicazione.

nginx e PHP-FPM
PHP, tramite il FastCGI Process Manager (FPM) integrato, si integra molto bene
con nginx, che un server leggero
dalle alte prestazioni. Usa meno memoria di
Apache e gestisce meglio le richieste simultanee. Questo
particolarmente
importante su server virtuali che non hanno molta memoria.
Scopri nginx
Scopri PHP-FPM
Scopri come configurare nginx e PHP-FPM in modo sicuro

Apache e PHP
PHP e Apache hanno fatto molta storia insieme. Apache totalmente configurabile
e ha molti moduli che estendono
le sue funzionalit. una
scelta comune per i server condivisi e una configurazione facile per i framework
PHP e le
applicazioni open source come WordPress. Sfortunatamente, Apache usa
pi risorse di nginx di default e non riesce a
gestire cos tanti visitatori
contemporeanei.
Ci sono molte configurazioni diverse per eseguire Apache con PHP. La pi comune
e la pi semplice da configurare
il prefork MPM con mod_php5. Nonostante
questa non sia la pi efficiente in termini di consumo di memoria, la
pi
semplice da configurare e usare. Questa probabilmente la scelta migliore se
non vuoi addentrarti troppo in
profondit nellamministrazione dei server. Nota
che per usare mod_php5 DEVI usare il prefork MPM.
In alternativa, se vuoi ottenere migliori performance e stabilit con Apache
puoi usare lo stesso sistema FPM di nginx
ed eseguire l[MPM worker] o
l[MPM event] con mod_fastcgi o mod_fcgid. Questa configurazione sar molto pi

efficiente nellutilizzo di memoria e molto pi veloce, ma pi complicata da


installare.
Scopri Apache
Scopri i Multi-Processing Modules
Scopri mod_fastcgi
Scopri on mod_fcgid

Server condivisi
PHP deve ringraziare i server condivisi per la sua popolarit. difficile
trovare un host che non abbia PHP installato,
ma assicurati che sia lultima
versione. I server condivisi permettono a te e altri sviluppatori di pubblicare
siti sulla
stessa machina. Il lato positivo che si tratta di un sistema
economico. Il lato negativo che non sai mai che tipo di
macello i tuoi vicini
creeranno; il rallentamento del server o lapertura di brecce di sicurezza sono
pericoli da tenere

in considerazione. Se il budget del tuo progetto lo permette,


evita i server condivisi.

Costruire e pubblicare la tua applicazione


Se ti trovi a dover modificare lo schema del database o eseguire i test prima
dellaggiornamento dei file manualmente,
ripensaci! Con ogni compito manuale in
pi che devi eseguire per pubblicare una nuova versione della tua
applicazione
aumentano le possibilit di un errore fatale. Che tu stia gestendo un semplice
aggiornamento, un
processo di build completo o una strategia di integrazione
continua, lautomazione dello sviluppo tua amica.
Tra i compiti che potresti voler automatizzare ci sono:
Gestione delle dipendenze
Compilazione e minificazione dei media
Esecuzione dei test
Creazione di documentazione
Pacchettizzazione
Pubblicazione

Strumenti di automazione dello sviluppo


Questi strumenti possono essere descritti come un insieme di script che
gestiscono compiti comuni nella
pubblicazione del software. Lo strumento non
parte del tuo software, ma agisce su di esso da fuori.
Ci sono molti strumenti open source disponibili per aiutarti con lautomazione
dello sviluppo, alcuni scritti in PHP,
altri no. Questo non dovrebbe impedirti
di usarli, se sono pi adatti per uno specifico compito. Ecco alcuni esempi.
Phing il modo pi facile per iniziare con la pubblicazione automatica nel
mondo di PHP. Con Phing puoi controllare
la pacchettizazione, la pubblicazione o
il processo di testing tramite un semplice file XML. Phing (che basato su

Apache Ant) fornisce un ricco set di compiti solitamente richiesti per


installare o aggiornare unapplicazione Web e
pu essere esteso con compiti
personalizzati, scritti in PHP.
Capistrano un sistema per programmatori medio-avanzati per eseguire
comandi in modo strutturato e ripetibile
su una o pi macchine remote. pre-
configurato per la pubblicazione di applicazioni Ruby on Rails, ma molti lo

usano per pubblicare applicazioni PHP. Il suo corretto utilizzo dipende


dalla conoscenza di Ruby e Rake.
Il post PHP Deployment with Capistrano sul blog di Dave
Gardner un buon punto dinizio per programmatori PHP
interessati a Capistrano.
Chef pi di un framework di pubblicazione. un framework di integrazione di
sistema molto potente scritto in
Ruby che non solo pubblica la tua applicazione
ma pu costruire lintero ambiente server o macchina virtuale.
Deployer uno strumento di pubblicazione scritto in PHP; semplice e
[funzionale. Esegue i compiti in parallelo,
supporta la pubblicazione atomica,
[mantiene la consistenza tra i server. Ha ricette per compiti comuni relativi a

[Symfony, Laravel, Zend Framework e Yii.


Risorse Chef per sviluppatori PHP
Serie in tre parti sulla pubblicazione di unapplicazione LAMP con Chef, Vagrant ed EC2
Articolo sullinstallazione e la configurazione di PHP 5.3 e PEAR con Chef
Video tutorial su Chef fatto da Opscode, i creatori di Chef

Altre letture:
Automatizza il tuo progetto con Apache Ant

Integrazione continua
Lintegrazione continua una pratica di sviluppo software in cui i membri di
un team
integrano il loro lavoro frequentemente. Generalmente ogni persona
integra il lavoro
almeno giornalmente, portando a pi integrazioni
giornaliere. Molti team trovano che
questo approccio riduca notevolmente i
problemi di integrazione e permette a un team di
sviluppare software coeso pi
rapidamente.
Martin Fowler
Ci sono diversi modi di implementare lintegrazione continua in PHP.
Recentemente Travis CI ha fatto un buon
lavoro nel rendere lintegrazione
continua una realt anche per piccoli progetti. Travis CI un sistema hostato
di
integrazione continua per la community open source. integrato con GitHub e
offre supporto di prima classe per
molti linguaggi, incluso PHP.
Altre letture:
Integrazione continua con Jenkins
Integrazione continua con PHPCI
Integrazione continua con Teamcity
Torna su

Virtualizzazione
Eseguire la tua applicazione in un ambiente di produzione diverso da quello di
sviluppo pu portare alla comparsa di
strani errori quando pubblichi la tua
applicazione. anche difficile mantenere i diversi ambienti di sviluppo

aggiornati allultima versione delle librerie usate quando lavori con un team di
sviluppatori.
Se stai sviluppando su Windows e pubblicando su Linux (o qualunque cosa che non
sia Windows) o stai sviluppando
in un team, dovresti considerare la possibilit
di usare una macchina virtuale. Pu sembrare complicato, ma oltre
agli ambienti
di virtualizzazione pi conosciuti come VMware e VirtualBox, ci sono strumenti
addizionali che
potrebbero aiutarti a configurare un ambiente virtuale in pochi
semplici passi.

Vagrant
Vagrant ti aiuta a costruire le tue macchine virtuali sfruttando
ambienti virtuali noti, e configura questi ambienti
basandosi su un singolo file
di configurazione. Queste macchine possono essere configurate manualmente,
oppure
puoi usare un software di provisioning come Puppet o
Chef per farlo al posto tuo. Eseguire il provisioning della
macchina di
base un ottimo modo per assicurarti che pi macchine vengano configurate nella
stessa maniera e
rimuove la necessit di mantenere complicate liste di comandi
dinstallazione. Puoi anche distruggere la macchina
e ricrearla senza troppi
passi manuali, rendendo cos semplice creare uninstallazione fresca.
Vagrant crea delle cartelle per condividere il codice tra lhost e la tua
macchina virtuale, il che significa che puoi
creare e modificare file sul tuo
host e poi eseguire il codice nella macchina virtuale.

Un po di aiuto
Se ti serve un picolo aiuto per iniziare a usare Vagrant ci sono dei servizi che
potrebbero essere utili:
tipiche (PHP tra le varie opzioni). Il provisioning effettuato con Chef.
PHP. Fortemente concentrato su PHP. Oltre alle macchine virtuali locali,
pu anche essere usato per
configurare servizi cloud. Il provisioning
effettuato con Puppet.
macchine virtuali per lo sviluppo web. Un singolo documento YAML controlla
tutto ci che viene installato
sulla macchina virtuale.
Playbook Ansible per progetti basati su PHP.

Docker
Oltre a usare Vagrant, un altro semplice modo per configurare un ambiente di
sviluppo e uno di produzione Docker.
Docker ti aiuta a fornire
container Linux per ogni tipo di applicazione. Ci sono molte immagini Docker
utili che
possono fornirti altri ottimi servizi (es. MySQL, PostgreSQL e molti
altri) senza la necessit di installare tali servizi
sulla tua macchina locale.
Dai unocchiata al Docker Hub Registry per avere una lista dei
contenitori pre-fabbricati
disponibili, che potrai poi eseguire ed usare con
facilit.

Esempio: Eseguire le tue applicazioni PHP in Docker


Dopo aver installato docker sulla tua macchina, potrai avviare
unistanza di Apache con supporto a PHP in un solo
passo. Il comando seguente
scaricher uninstallazione di Apache completamente funzionante con lultima
versione
di PHP, e render disponibile la directory /path/ai/tuoi/file/php
allindirizzo http://localhost:8080 :
docker run -d --name mio-webserver-php -p 8080:80 -v /path/ai/tuoi/file/php:/var/www/html/
php:apache

Dopo aver eseguito docker run il tuo container sar inizializzato ed eseguito.
Se vuoi fermare o avviare
nuovamente il tuo container, puoi usare il nome che
hai fornito ed eseguire semplicemente docker stop miowebserver-php e
docker start mio-webserver-php senza fornire nuovamente i parametri menzionati
sopra.

Altre risorse su Docker


I comandi menzionati sopra mostrano solo un modo veloce per eseguire un web
server Apache con supporto a PHP,
ma ci sono molte altre cose che puoi fare con
Docker. Una delle cose pi importanti per gli sviluppatori PHP
collegare il
proprio web server con listanza di un database, per esempio. La
Docker User Guide spiega nel dettaglio
come farlo.
Sito web di Docker
Installazione di Docker
Immagini Docker nel Docker Hub Registry
Docker User Guide
Torna su

Caching
PHP piuttosto veloce gi di suo, ma possono sorgere dei problemi quando esegui
connessioni remote, carichi file
etc. Per fortuna, ci sono diversi strumenti a
disposizione per velocizzare certe parti dellapplicazione, o ridurre il
numero
di volte che questi compiti lenti devono essere eseguiti.

Opcode cache
Quando un nuovo PHP file viene eseguito, prima compilato in opcode; solo dopo
lopcode viene eseguito. Se un file
PHP non viene modificato, lopcode rimane lo
stesso. Questo significa che il processo di compilazione uno spreco di
risorse
computazionali.
qui che le cache dellopcode entrano in gioco. Evitano compilazioni inutili
salvando lopcode in memoria e
riusandolo nelle chiamate successive. Impostare
una cache dellopcode una questione di minuti, e la tua
applicazione sar
molto pi veloce. Non c alcuna ragione per non usarla.
A partire da PHP 5.5, c una cache dellopcode integrata chiamata
OPcache. anche disponibile per versioni
precedenti.
Altre risorse sulle cache dellopcode:
OPcache (integrata a partire da PHP 5.5)
APC (PHP 5.4 e precedenti)
XCache
Zend Optimizer+ (parte del pacchetto Zend Server)
WinCache (estensione per MS Windows Server)
lista di acceleratori PHP su Wikipedia

Caching degli oggetti


Alcune volte pu essere utile mettere in cache oggetti singoli nel tuo codice,
come, per esempio, dati che sono lenti da
ottenere o chiamate al database il cui
risultato cambia difficilmente. Puoi usare software di caching degli oggetti per

mantenere questi pezzi di dati in memoria per un successivo accesso estremamente


veloce. Se salvi questi elementi in
un data store dopo averli recuperati, e poi
li prendi direttamente dalla cache per le richieste successive, puoi ottenere
un
notevole miglioramento delle performance e riducendo il carico del tuo database.
Molte soluzioni famose di caching del bytecode ti permettono anche di mettere in
cache dati personalizzati, dunque ci
sono ancora pi ragioni per trarne
vantaggio. APCu, XCache e WinCache forniscono tutti API per salvare dati dal tuo

codice PHP nella loro memoria cache.


I sistemi di caching degli oggetti pi comunemente usati sono APCu e memcached.
APCu una scelta eccellente per il
caching degli oggetti. Include una semplice
API per aggiungere i tuoi dati alla sua memoria cache ed molto
semplice da
configurare e usare. Lunica vera limitazione di APCu che legato al Web
server su cui installato.
Memcached, invece, installato come un servizio
separato e pu essere letto dalla rete, il che significa che puoi
memorizzare
oggetti in un data store super-veloce in una posizione centrale e molti sistemi
diversi possono
accedervi.
Nota che quando esegui PHP come unapplicazione (Fast-)CGI nel tuo Web server,
ogni processo PHP avr la sua
cache (i dati di APCu non sono condivisi tra i
processi). In questi casi, potresti voler usare memcached, che non

legato ai
processi PHP.
In una configurazione di rete APCu sar generalmente pi performante di
memcached in termini di velocit di
accesso, ma memcached potr scalare meglio e
pi velocemente. Se non pensi di eseguire la tua applicazioni su
server
multipli, o non ti servono le funzionalit aggiuntive che memcached offre,
allora APCu probabilmente la
scelta migliore per il caching degli oggetti.
Esempio di utilizzo con APCu:
<?php
// controlla se ci sono dati salvati come 'expensive_data' in cache
$data = apc_fetch('expensive_data');
if ($data === false) {
// dati non in cache; salva il risultato per uso successivo
apc_add('expensive_data', $data = get_expensive_data());
}
print_r($data);

Prima di PHP 5.5, APC fornisce sia una cache degli oggetti che una cache del
bytecode. APCu un progetto per
portare la cache degli oggetti di APC a PHP 5.5
e successivi, dato che PHP Ora ha una cache del bytecode integrata
(OPCache).

Impara a usare i sistemi di caching degli oggetti pi famosi:


APCu
Funzioni APC
Memcached
Redis
API XCache
Funzioni WinCache
Torna su

Documentare il tuo codice


PHPDoc
PHPDoc uno standard informale per i commenti al codice PHP. Ci sono molti
tag diversi disponibili. La lista
completa dei tag e degli esempi pu essere
trovata nel manuale di PHPDoc.
Qui sotto c un esempio di come potresti documentare una classe con alcuni
metodi:
<?php
/**
* @author Un Nome <un.nome@example.com>
* @link http://www.phpdoc.org/docs/latest/index.html
*/

class DateTimeHelper
{
/**
* @param mixed $anything Qualunque cosa che si possa convertire in un oggetto \DateTime
*
* @throws \InvalidArgumentException
*
* @return \DateTime
*/
public function dateTimeFromAnything($anything)
{
$type = gettype($anything);
switch ($type) {
// Del codice che prova a restituire un oggetto \DateTime
}
throw new \InvalidArgumentException(
"Failed Converting param of type '{$type}' to DateTime object"
);
}
/**
* @param mixed $date Qualunque cosa che si possa convertire in un oggetto \DateTime
*
* @return void
*/
public function printISO8601Date($date)
{
echo $this->dateTimeFromAnything($date)->format('c');
}
/**
* @param mixed $date Qualunque cosa che si possa convertire in un oggetto \DateTime
*/
public function printRFC2822Date($date)
{
echo $this->dateTimeFromAnything($date)->format('r');
}
}

La documentazione della classe ha un tag @author e un tag @link. Il tag


@author usato per documentare lautore
del codice e pu essere ripetuto per
documentare pi autori. Il tag @link usato per linkare a un sito web che ha
una
relazione col codice.
Dentro la classe, il primo metodo ha un tag @param che documenta il tipo, il
nome e la descrizione del parametro
passato al metodo. Inoltre, ha dei tag
@return e @throws che documentano rispettivamente il tipo restituito e

qualunque eccezione che potrebbe essere lanciata.


Il secondo e il terzo metodo sono molto simili e hanno un solo tag @param come
il primo metodo. La differenza
importante nel secondo e terzo metodo
linclusione/esclusione del tag @return. @return void informa

esplicitamente
che non sar restituito nulla; storicamente, omettere la dichiarazione @return
void ha lo stesso
significato (nessuna restituzione).
Torna su

Risorse
Ufficiali
Sito di PHP
Documentazione di PHP

Persone da seguire
Rasmus Lerdorf
Fabien Potencier
Derick Rethans
Chris Shiflett
Sebastian Bergmann
Matthew Weier OPhinney
Pdraic Brady
Anthony Ferrara
Nikita Popov

Mentoring
phpmentoring.org - Mentoring formale, peer to peer nella comunit PHP.

Provider PaaS PHP


PagodaBox
AppFog
Heroku
fortrabbit
Engine Yard Cloud
Red Hat OpenShift Platform
dotCloud
AWS Elastic Beanstalk
cloudControl
Windows Azure
Google App Engine
Jelastic

Framework

Piuttosto che reinventare la ruota, molti provider PHP usano dei framework per
costruire le proprie applicazioni. I
framework astraggono la maggior parte dei
dettagli di basso livello e forniscono delle utili interfacce di semplice

utilizzo per realizzare molte funzionalit comuni.


Non hai bisogno di un framework per ogni progetto. A volte il solo PHP il modo
giusto per realizzare le cose, ma se
hai bisogno di un framework, ce ne sono tre
tipi:
Micro-framework
Framework completi
Framework a componenti
I micro-framework forniscono essenzialmente un modo per mappare una richiesta
HTTP a un callback, un controller
o un metodo il pi velocemente possibile, e a
volte forniscono alcune libreria extra per aiutare nello sviluppo come
librerie
di base per il database e cose del genere. Sono prevalentemente usati nella
costruzione di servizi HTTP
remoti.
Molti framework aggiungono un nome considerevole di funzionalit a quelle
disponibili in un micro-framework;
questi vengono detti framework completi. Di
solito sono distribuiti con degli ORM, pacchetti per lautenticazione etc.
I framework a componenti sono insiemi di librerie specializzate e con una sola
responsabilit. Diversi framework a
componenti possono essere usati insieme per
creare un micro-framework o un framework completo.
Framework PHP popolari

Componenti
Come menzionato sopra, i componenti sono un altro approccio alla creazione,
distribuzione e implementazione di
codice condiviso. Esistono diversi repository
di componenti; i due pi famosi sono:
Packagist
PEAR
Entrambi questo repository hanno degli strumenti da linea di comando associati
per aiutarti nel processo di
installazione e aggiornamento, e sono stati
spiegati in dettaglio nella sezione Gestione delle dipendenze.
Ci sono anche dei framework a componenti e provider componenti che non offrono
alcun framework. Questi progetti
forniscono solo unaltra sorgente di pacchetti
che idealmente hanno poche o nessuna dipendenza verso altri
pacchetti o
framework specifici.
Per esempio, puoi usare il pacchetto Validation di FuelPHP senza dover usare
il framework FuelPHP.
Aura
FuelPHP
Hoa Project
Orno
Componenti di Symfony
The League of Extraordinary Packages
Componenti Illuminate di Laravel
Eloquent ORM
Queue

I componenti Illuminate di FuelPHP saranno meglio separati dal framework


Laravel. Per ora, solo i componenti
meglio separati sono elencati sopra.

Altre risorse utili


Cheatsheet
PHP Cheatsheets - per le comparazioni tra
variabili, le operazioni aritmetiche e i test di variabili in varie
versioni
di PHP
PHP Security Cheatsheet

Altre pratiche raccomandate


PHP Best Practices
Best practices for Modern PHP Development

Luniverso PHP
PHP Developer blog

Video tutorial
Canali Youtube
PHP Academy
The New Boston
Sherif Ramadan
Level Up Tuts

Video a pagamento
Standards and Best practices
PHP Training su Pluralsight
PHP Training su Lynda.com
PHP Training su Tutsplus

Libri
Ci sono un sacco di libri in giro su PHP, ma alcuni sono molto vecchi e non
contengono pi informazioni accurate. Ci
sono anche libri pubblicati per PHP
6 che non esiste, e non esister mai. La prossima versione di PHP sar
chiamata
PHP 7 per via di questi libri.
Questa sezione mira a essere un documento in costante aggiornamento sui libri
raccomandati per lo sviluppo PHP in
generale. Se vuoi che il tuo libro sia
aggiunto, invia una PR e sar presa in esame.

Libri gratuiti
PHP The Right Way - Questo sito web
disponibile in maniera completamente gratuita come libro.

Libri a pagamento
Modernizing Legacy Applications In PHP - Metti
il tuo codice sotto controllo in una serie di piccoli e specifici
passi
Building Secure PHP Apps - Impara
le basi di sicurezza che uno sviluppatore anziano di solito acquisisce

solitamente in anni di esperienza; il tutto condensato in una pratica guida


The Grumpy Programmers Guide To Building Testable PHP Applications
Imparare a scrivere codice testabile non deve per forza fare schifo.
Securing PHP: Core Concepts -
Una guida ad alcuni dei termini di sicurezza pi comuni; fornisce esempi del

loro utilizzo quotidiano in PHP


Scaling PHP - Smetti di giocare al sysadmin
e torna a programmare
Signaling PHP - I segnali PCNLT sono di
grande aiuto quando si scrivono script PHP per la linea di comando.
Torna su

Comunit
La comunit PHP tanto diversificata quanto grande, e i suoi membri sono pronti
e desiderosi di aiutare i nuovi
programmatori PHP. Considera lidea di entrare
nel tuo gruppo PHP locale (PUG) o di partecipare a conferenze PHP
pi grandi per
avere maggiori informazioni sulle pratiche qui descritte. Puoi passare nel
canale IRC #phpc su
irc.freenode.com e seguire laccount Twitter
@phpc. Fatti vedere, incontra nuovi sviluppatori, impara nuove
cose e,
soprattutto, fai nuovi amici! Altre risorse della comunit includono la
Comunit programmatori PHP su Google+ e

StackOverflow.
Guarda il calendario ufficiale degli eventi PHP

PHP User Groups


If you live in a larger city, odds are theres a PHP user group nearby. You can easily find your local PUG at
the
usergroup-list at php.net which is based upon PHP.ug. Alternate sources might be
Meetup.com or a search for php
user group near me using your favourite search engine
(i.e. Google). If you live in a smaller town, there may not
be a local PUG; if thats the case, start one!
Special mention should be made of two global user groups: NomadPHP and PHPWomen. NomadPHP offers twice
monthly
online user group meetings with presentations by some of the top speakers in the PHP community.

PHPWomen is a non-exclusive user group originally targeted towards the women in the PHP world. Membership is
open to
everyone who supports a more diverse community. PHPWomen provide a network for support, mentorship
and education, and
generally promote the creating of a female friendly and professional atmosphere.
Read about User Groups on the PHP Wiki

Conferenze PHP
La comunit PHP tiene anche delle conferenze regionali e nazionali in molti
Paesi in tutto il mondo. A questi eventi
parlano generalmente membri noti della
comunit PHP, dunque una buona opportunit per imparare direttamente
dai
leader del settore.
Trova una conferenza PHP

Torna su

Riconoscimenti
Creato e manutenuto da
Josh Lockhart

Collaboratori del progetto


Kris Jordan
Phil Sturgeon

Contributori del progetto


philsturgeon
codeguy
peterkokot
KrisJordan
grakic
jrfnl
stevenbenner
philipobenito
maglnet
ylynfatt
chartjes
markushausammann
Xosofox
rogeriopradoj
aranw
zeroecco
ccirello
gerardroche
auroraeosrose
eoconnell
garoevans
briannesbitt
NeilMasters
getjump
Inoryy
wilmoore
johnstevenson
bocharsky-bw
chriscct7
Blackshawk
astorm
reinink
mc10
telephone
padraic
Sean-Der

Sgoettschkes
surajprogrammez
tvlooy
deadlyhifi
ziadoz
singles
jcloutz
iflista
enygma
galdiolo
coreymcmahon
dave1010
djoos
onethumb
ericmartel
echernyavskiy
FlorianWolters
frankperez87
hannesvdvreken
jkobus
ifdattic
Jayin
jcarouth
afhole
jwpage
josh-mcq
kayladnls
m92o
ThaDafinser
mathroc
mattkirwan
inanimatt
akshayagarwal
celeritas17
rhynodesigns
shahariaazam
simonrjones
cn007b
zsuraski
kenden
marian-r
mkaatman
ostark
harikt
elfet
mattbasta
alimac
heiglandreas
localheinz
deviantintegral
apinstein
tonicospinelli

ArloL
ArtemGordinsky
aykutfarsak
bartosz-maciaszek
benedmunds
appleboy
BradEstey
bramus
bcrowe
chaseconey
drbyte
smoakey

Sponsor del progetto


New Media Campaigns

PHP: The Right Way di Josh Lockhart rilasciato sotto licenza Creative Commons Attribution-NonCommercial-ShareAlike
3.0 Unported License.
Basato su un lavoro a www.phptherightway.com.