Corso di Laurea Specialistica in Ingegneria Informatica Corso di Linguaggi e Tecnologie Web A. A. 2011 - PHP: Hypertext Preprocessor Caratteristiche avanzate Eufemia Tinelli 1
Contenuti PHP ad oggetti Definizione di classi, metodi e oggetti PDO & PDOStatement: Interazione con i database Gestione delle sessioni con la classe HTTPSession MVC con PHP Implementazione utente Utilizzo di Framework PHP 2
PHP ad oggetti Con la versione 4 di PHP è stato introdotto il supporto al paradigma di programmazione orientato agli oggetti, poi migliorato nella versione 5 PHP 5 consente di: definire classi (individuare tutte le caratteristiche e i comportamenti di un determinato tipo di oggetti: decidere quali attributi e metodi sono disponibili a tutti gli script e quali sono privati) creare oggetti che siano istanza di classi creare gerarchie di oggetti (eredità semplice) utilizzare l incapsulamento (information hiding) utilizzare il polimorfismo (overloading dei metodi) 3
Creare una classe in PHP5 <?php class Prova { public $attr_public; private $attr_private; protected $attr_protected; public function construct(parametri) { // operazioni di inizializzazione public function destruct(parametri) { // operazioni eseguite prima della distruzione public function publicmethod(parametri) { protected function protectedmethod(parametri) {?> private function privatemethod(parametri) { 4
Instanziare una classe Il costruttore (implementato dal metodo construct) viene eseguito ogni volta che si crea un nuovo oggetto. Può ricevere dei parametri che servono ad inizializzare i valori delle proprietà interne dell oggetto da creare Il distruttore (implementato dal metodo destruct) che verranno chiamati ogni qualvolta il garbage collector di PHP distruggerà l'oggetto. $oggetto= new nome_classe(parametri del costruttore) Il meccanismo per accedere a una variabile (o metodo) interna ad una classe è rappresentato dalla seguente sintassi, dove $this rappresenta l oggetto che sarà costruito a runtime: $this->nome variabile $this->nome_metodo(parametri) Per accedere a una proprietà o a un metodo di un oggetto si utilizza la sintassi: $oggetto ->nome_variabile $oggetto ->nome_metodo(parametri) 5
Passaggio dei parametri Nella metodologia a oggetti i passaggi dei parametri alle funzioni possono avvenire o per valore o per riferimento Nel PHP 5 gli oggetti vengono passati solo per riferimento non si fa una copia dell oggetto, ma viene inoltrato alla funzione un indirizzo della posizione dell oggetto in memoria Passaggio esplicito per riferimento: Per passare per riferimento anche variabili di tipi primitivi basta aggiungere, all interno della dichiarazione della funzione, il carattere & prima del nome del parametro da passare <?php // Passaggio per riferimento function incremento(&$num){ $num ++; return $num; $numero = 3; incremento($numero); echo $numero; // Stampa 4;?> <?php // forzare anche il ritorno di tipi primitivi per riferimento function &incrementanum(&$num){ $num += 10; return $num;?> 6
Superclassi, sottoclassi e overriding: : Esempio (1) <?php class A { public function sayhello() { echo "Hello!"; class B extends A { public function sayhello() { echo "Ciao Ciao!"; $b = new B(); // stampa "Ciao Ciao!" $b->sayhello();?> <?php class A { public function sayhello() { echo "Hello!"; class B extends A { public function sayhello() { parent::sayhello(); echo "Ciao Ciao!"; $b = new B(); // stampa "Hello! Ciao Ciao!" $b->sayhello();?> 7
Superclassi, sottoclassi e overriding: : Esempio (2) <?php class A { public function construct($a, $b) { $this->a = $a; $this->b = $b; // metodi... class B extends A { public function construct($a, $b, $c) { parent:: construct($a, $b); $this->c = $c; // metodi... $b = new B(10, 20, 30); echo $b->a; // stampa 10 echo $b->b; // stampa 20 echo $b->c; // stampa 30?> 8
PDO - PHP Data Objects (2) Rappresenta un persistent layer di elevata astrazione grazie al quale è possibile interfacciare ed utilizzare allo stesso modo qualunque database, rendendo di fatto portabili il codice sorgente e le applicazioni che ne fanno uso La portabilità è garantita utilizzando drivers che, implementando le PDO Interfaces, espongo metodi comuni che incapsulano caratteristiche specifiche e proprietarie di ogni DB utilizzabile (non richiedere più l'utilizzo di funzioni specifiche come, per esempio, le mysql_* e pgsql_* functions) Installazione basta decommentare le estensioni che interessano, es.: extension=php_pdo_mysql.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll DSN (Data Source Name) permette a PHP di scegliere correttamente il driver specifico in fase di connessione al DB. E costituito da: driver ':' stringa di connessione (specifica per ogni DB) 9
Esempi PDO PostgreSQL ch06.zip Connessione & disconnessione (pdo-conn-test.php) Gestione degli errori (adv-pdo-test.php) CREATE TABLE "user" ( "id" SERIAL PRIMARY KEY NOT NULL, "username" character varying(32), "password_hash" character varying(32), "first_name" character varying(64), "last_name" character varying(64)); GRANT ALL PRIVILEGES ON "user" TO "chaptersix"; GRANT ALL PRIVILEGES ON "user_id_seq" TO "chaptersix"; INSERT INTO "user"("username", "password_hash", "first_name", "last_name") VALUES('ed', md5('berkhamsted'), 'Ed', 'Lecky-Thompson'); INSERT INTO "user"("username", "password_hash", "first_name", "last_name") VALUES('steve', md5('newyork'), 'Steve', 'Nowicki'); INSERT INTO "user"("username", "password_hash", "first_name", "last_name") VALUES('marie', md5('leicester'), 'Marie', 'Ellis'); INSERT INTO "user"("username", "password_hash", "first_name", "last_name") VALUES('harriet', md5('cambridge'), 'Harriet', 'Frankland'); 10
Esempio preparare gli statement: due modalità per passare parametri variabili alle query SQL $i = 0; $strusername = ed ; $strquery = "SELECT * FROM \"user\" WHERE username = $strusername "; $objstatement = $objpdo->prepare($strquery); $objstatement->execute(); while ($arrow = $objstatement->fetch(pdo::fetch_assoc)) { print"row$i<br/>\n"; foreach ($arrow as $key => $value) { print " - Column $key, value $value<br />\n"; $i++; La stringa della query è elaborata dal motore SQL La stringa della query è elaborata direttamente da PHP Definisco solo un parametro da elaborare successivamente $i = 0; $strusername = ed ; $strquery = "SELECT * FROM \"user\" WHERE username = :username"; $objstatement = $objpdo->prepare($strquery); $objstatement = $objpdo->bindparam( :username, $strusername, PDO::PARAM_STR); $objstatement->execute(); while ($arrow = $objstatement->fetch(pdo::fetch_assoc)) { print"row$i<br/>\n"; foreach ($arrow as $key => $value) { print " - Column $key, value $value<br />\n"; $i++; 11
Creazione di istanze singleton Come evitare la creazione di molteplici istanze della classe PDO in una data richiesta? <?php Class PDOFactory { public static function getpdo($strdsn) { $strkey = md5($strdsn); Implementazione del pattern Singleton if(!($globals[ PDOS ][$strkey] instanceof PDO)) { $GLOBALS[ PDOS ][$strkey] = new PDO($strDSN); { return($globals[ PDOS ][$strkey]); Al posto di $objpdo = new PDO($strDSN); dobbiamo usare la seguente istruzione: $objpdo = PDOFactory::getPDO($strDSN); 12
Gestione delle sessioni su DB ch12.zip Classe HTTPSession (HTTPSession.phpm) 13
Pattern Model-View View-Controller (MVC) Divide un applicazione interattiva in 3 componenti Il Model incapsula funzionalità e dati che sono indipendenti dalla specifica rappresentazione dell output o dal comportamento di input Le Views mostrano le informazioni all utente. Una View ottiene i dati dal Model (possono esserci più View di uno stesso Model) I Controller gestiscono l input utente e la comunicazione Model- View. I componenti Controller ricevono l input che di solito codifica un evento come il movimento del mouse o un input da tastiera. Gli eventi sono poi tradotti in service request per il Model La consistenza tra UI e Model è garantita da un meccanismo di propagazione dei cambiamenti quando un modello cambia il suo stato, notifica tutte le sue viste ed i suoi controller del cambiamento in modo che questi possano aggiornare il loro stato in modo appropriato 14
Pattern MVC in PHP 15
Esempio in PHP.. prima <? // connessione alla base di dati $cn = mysql_connect('localhost', 'utente', 'password'); mysql_select_db('db', $cn); // consultiamo SQL per ottenere gli articoli $risultato=mysql_query('select data, titolo FROM articolo', $cn);?> <h1>listato di articoli</h1> <table> <tr> <th>data</th> <th>titolo</th> </tr> <?php // stampa il risultato while ($riga = mysql_fetch_array($risultato, MYSQL_ASSOC)) { echo "<tr>"; echo "<td> ".$riga['data']." </td>"; echo "<td> ".$riga['titolo']." </td>"; echo "</tr>";?> </table> <?php //chiudiamo la connessione mysql_close($cn);?> 16
dopo MVC in PHP (1) <? require('vista.php'); $cn = mysql_connect('localhost', 'utente', 'password'); mysql_select_db('db', $cn); $risultato = mysql_query('select data, titolo FROM articolo', $cn); $articoli = array(); while($articolo = mysql_fetch_assoc($risultato)) { $articoli[] = $articolo; mysql_close();?> <h1>listato di Articoli</h1> <table> <tr> <th>data</th> <th>titolo</th> </tr> controller.php <?php foreach($articoli as $articolo):?> <tr> <td> <?php echo $articolo['data']?> </td> <td> <?php echo $articolo['titolo']?> </td> </tr> <?php endforeach;?> </table> view.php 17
dopo MVC in PHP (2) <?php function getarticoli() { $cn = mysql_connect('localhost', 'utente', 'password'); mysql_select_db('db', $cn); $cn); $risultato = mysql_query('select data, titolo FROM articolo', $articoli = array();?> model.php while($articolo = mysql_fetch_assoc($risultato)) { $articoli[] = $articolo; mysql_close(); require('modello.php'); $articoli = getarticoli(); controller.php require('vista.php'); control.php 18
Zend Framework (ZF) - http://framework.zend.com framework.zend.com/ Zend Framework è un framework open source per lo sviluppo di applicazioni e servizi web con PHP 5 che supporta il pattern MVC ZF è costituito da una libreria di componenti che possono essere raggruppati in sei macro categorie: Core MVC Autenticazione ed Accesso Internationalization Servizi Web Inter-application communication La struttura di un progetto ZF 19
MVC in Zend Framework Architettura logica Classi Zend 20
Riferimenti E. L. Thompson, S. D. Nowicki, T. Myer, PHP6 - Guida per lo sviluppatore, Hoepli, 2009 P. B. MacIntyre, PHP Le tecniche per scrivere il codice migliore, Hops, 2010. 21