PHP - SisInfLab

Transcript

PHP - SisInfLab
Corso di Laurea Specialistica in
Ingegneria Informatica
Corso di Linguaggi e Tecnologie Web
A. A. 2011 - 2012
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
Eufemia Tinelli - LTW A.A. 20112011-2012
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)
Eufemia Tinelli - LTW A.A. 20112011-2012
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) { … }
}
?>
Eufemia Tinelli - LTW A.A. 20112011-2012
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)
Eufemia Tinelli - LTW A.A. 20112011-2012
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;
}
?>
Eufemia Tinelli - LTW A.A. 20112011-2012
6
Superclassi, sottoclassi e overriding: Esempio (1)
<?php
class A {
<?php
class A {
public function sayHello() {
echo "Hello!"; }
public function sayHello() {
echo "Hello!"; }
}
}
class B extends A {
public function sayHello() {
echo "Ciao Ciao!";
}
}
class B extends A {
$b = new B();
// stampa "Ciao Ciao!"
$b->sayHello();
?>
public function sayHello() {
parent::sayHello();
echo "Ciao Ciao!"; }
}
$b = new B();
// stampa "Hello! Ciao Ciao!"
$b->sayHello();
?>
Eufemia Tinelli - LTW A.A. 20112011-2012
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
?>
Eufemia Tinelli - LTW A.A. 20112011-2012
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)
Eufemia Tinelli - LTW A.A. 20112011-2012
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",
VALUES('ed', md5('berkhamsted'), 'Ed', 'Lecky-Thompson');
INSERT INTO "user"("username", "password_hash", "first_name",
VALUES('steve', md5('newyork'), 'Steve', 'Nowicki');
INSERT INTO "user"("username", "password_hash", "first_name",
VALUES('marie', md5('leicester'), 'Marie', 'Ellis');
INSERT INTO "user"("username", "password_hash", "first_name",
VALUES('harriet', md5('cambridge'), 'Harriet', 'Frankland');
Eufemia Tinelli - LTW A.A. 20112011-2012
"last_name")
"last_name")
"last_name")
"last_name")
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++;
}
Eufemia Tinelli - LTW A.A. 20112011-2012
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);
Eufemia Tinelli - LTW A.A. 20112011-2012
12
Gestione delle sessioni su DB – ch12.zip
• Classe HTTPSession (HTTPSession.phpm)
Eufemia Tinelli - LTW A.A. 20112011-2012
13
Pattern Model-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 ModelView. 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
Eufemia Tinelli - LTW A.A. 20112011-2012
14
Pattern MVC in PHP
Eufemia Tinelli - LTW A.A. 20112011-2012
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);
?>
Eufemia Tinelli - LTW A.A. 20112011-2012
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
Eufemia Tinelli - LTW A.A. 20112011-2012
17
…dopo…MVC in PHP (2)
<?php
function getArticoli() {
$cn = mysql_connect('localhost', 'utente', 'password');
mysql_select_db('db', $cn);
$risultato = mysql_query('SELECT data, titolo FROM articolo',
$articoli = array();
$cn);
while($articolo = mysql_fetch_assoc($risultato))
{ $articoli[] = $articolo; }
} ?>
model.php
mysql_close();
require('modello.php');
$articoli = getArticoli();
controller.php
require('vista.php');
control.php
Eufemia Tinelli - LTW A.A. 20112011-2012
18
Zend Framework (ZF) - http://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
Eufemia Tinelli - LTW A.A. 20112011-2012
19
MVC in Zend Framework
Classi Zend
Architettura logica
Eufemia Tinelli - LTW A.A. 20112011-2012
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.
Eufemia Tinelli - LTW A.A. 20112011-2012
21