|
Una classe è una collezione di variabili e funzioni che utilizzano queste variabili. Una classe si definisce
usando la seguente sintassi:
<?php
class Cart
{
var $items; // Articoli nel carrello
// Aggiunge $num articoli di $artnr nel carrello
function add_item ($artnr, $num)
{
$this->items[$artnr] += $num;
}
// Prende $num articoli di $artnr e li rimuove dal carrello
function remove_item ($artnr, $num)
{
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?>
Il codice definisce una classe chiamata Cart composta da un array associativo che archivia gli articoli nel
carrello e due funzioni per aggiungere e rimuovere gli articoli dal carrello stesso.
Cautela
- Il nome stdClass è usato esclusivamente da Zend ed è riservato. Non è quindi possibile creare una classe chiamata stdClass in PHP.
- I nomi di funzione __sleep e __wakeup sono riservati e magici nelle classi PHP. Non è possibile creare funzioni con questi nomi nelle classi definite dall'utente, a meno che non sia desiderata la funzionalità magica connessa a questi nomi. Si veda sotto per avere più informazioni.
- PHP riserva tutti i nomi di funzione che iniziano con __ a funzioni magiche. Si suggerisce di non usare nomi di funzioni che utilizzano con i caratteri __in PHP a meno che non si desideri implementare una funzionalità magica.
In PHP 4, sono permesse inizializzazioni di variabili con valori costanti solamente grazie all'uso di var. Per
inizializzare variabili con valori non-costanti, bisogna creare una funzione d'inizializzazione che è chiamata
automaticamente all'istanziazione di un oggetto da una classe. Questo tipo di funzione si chiama costruttore .
<?php
class Cart
{
var $todays_date;
var $name;
var $owner;
var $items;
function Cart()
{
$this->todays_date = date("Y-m-d");
$this->name = $GLOBALS['firstname'];
/* etc ... */
}
}
?>
Le classi sono tipi del linguaggio, e sono modelli per variabili reali. Per creare una variabile oggetto si usa
l'operatore new.
<?php
$cart = new Cart;
$cart->add_item("10", 1);
$another_cart = new Cart;
$another_cart->add_item("0815", 3);
?>
Il codice sopra, genera gli oggetti $cart e $another_cart, dalla classe Cart. La funzione
add_item() dell'oggetto $cart è chiamata per aggiungere una ricorrenza dell'articolo numero 10 a
$cart. A $another_cart sono aggiunte 3 ricorrenze dell'articolo numero 0815.
extends
Spesso si ha bisogno di avere classi con variabili e funzioni simili ad altre classi. É buona norma definire una
classe in modo generico, sia per poterla riutilizzare spesso, sia per poterla adattare a scopi specifici. Per
facilitare questa operazione, è possibile generare classi per estensione di altre classi. Una classe estesa o
derivata ha tutte le variabili e le funzioni della classe di base più tutto ciò che viene aggiunto dall'estensione.
Non è possibile che una sottoclasse, ridefinisca variabili e funzioni di una classe madre. Una classe estesa
dipende sempre da una singola classe di base: l'eredità multipla non è supportata. Le classi si estendono
usando la parola chiave 'extends'.
<?php
class Named_Cart extends Cart
{
var $owner;
function set_owner ($name)
{
$this->owner = $name;
}
}
?>
Qui viene definita una classe Named_Cart che ha tutte le funzioni e variabili di Cart più la variabile
$owner e la funzione set_owner(). Viene creato un carrello con nome con il metodo usato in
precedenza, in più la classe estesa permette di settare o leggere il nome del carrello. Si possono usare
variabili e funzioni sia di Cart che della sua estensione:
<?php
$ncart = new Named_Cart; // Crea un carrello con nome
$ncart->set_owner("kris"); // Assegna il nome al carrello
print $ncart->owner; // stampa il nome del proprietario
$ncart->add_item("10", 1); // (funzionalità ereditata da Cart)
?>
La relazione mostrata è chiamata relazione "genitore-figlio". Si crea una classe di base, poi utilizzando
extends si crea una nuova classe basata sulla classe genitore: la classe figlia. Successivamente si può usare la
classe figlia come classe base per un'altra classe.
Nota: Una classe deve essere definita prima di essere utilizzata! Se si vuole la classe Named_Cart che
estende la classe Cart, bisogna definire una classe Cart prima. Se si vuole creare un'altra classe chiamata
Yellow_named_cart basata sulla classe Named_Cart bisogna definire la classe Named_Cart prima.
Per farla breve: l'ordine di definizione delle classi è importante.
Costruttori
I costruttori sono funzioni che esistono in una classe e che sono chiamate automaticamente quando si crea
una nuova istanza di una classe con new. In PHP 3, una funzione si trasforma in un costruttore quando ha lo
stesso nome di una classe. In PHP 4, una funzione diventa un costruttore, quando ha lo stesso nome di una
classe ed è definita all'interno della classe stessa - la differenza è sottile, ma cruciale.
<?php
// Funziona in PHP 3 e PHP 4.
class Auto_Cart extends Cart
{
function Auto_Cart()
{
$this->add_item ("10", 1);
}
}
?>
Questo codice definisce una classe Auto_Cart, che non è altro che Cart più un costruttore che inizializza
il carrello con una occorrenza dell'articolo numero "10" ogni volta che un nuovo Auto_Cart è creato con
new. I costruttori possono avere degli argomenti, e gli argomenti possono essere facoltativi, questo li rende
molto versatili. Per poter usare una classe senza specificare parametri, tutti i parametri del costruttore devono
essere resi facoltativi con valori di default.
<?php
// Funziona in PHP 3 and PHP 4.
class Constructor_Cart extends Cart
{
function Constructor_Cart($item = "10", $num = 1)
{
$this->add_item ($item, $num);
}
}
// Istanzia il vecchio e noioso carrello.
$default_cart = new Constructor_Cart;
// Un carrello nuovo ...
$different_cart = new Constructor_Cart("20", 17);
?>
serialize()
L’operazione di serializzazione di un oggetto restituisce una stringa che contiene una rappresentazione in
caratteri di tutti i valori che possono essere memorizzati in PHP. unserialize() può usare questa stringa
per ricreare dai valori variabili utilizzabili.
Usando serialize() per salvare un oggetto si salveranno tutte le variabili dell'oggetto. Le funzioni
dell'oggetto non sono salvate, viene salvato solo il nome della classe.
Per potere usare unserialize() su un oggetto, la classe dell'oggetto deve essere definita. Cioè se avete
un oggetto $a della classe A su una pagina di nome page1.php e usate serialize(), otterrete una
stringa che si riferisce alla classe A e contiene tutti i valori delle variabili contenute in $a. Se desiderate poter
deserializzare l'oggetto in un'altra pagina chiamata page2.php, dovete ricreare $a dalla classe A, la
definizione della classe A perciò deve essere presente nella pagina page2.php. Questo può essere fatto per
esempio memorizzando la definizione della classe A in un file che viene incluso sia in page1.php che in
page2.php.
<?php
// classa.inc:
class A
{
var $one = 1;
function show_one()
{
echo $this->one;
}
}
// page1.php:
include("classa.inc");
$a = new A;
$s = serialize($a); // memorizzare $s in qualche posto della page2.
$fp = fopen("store", "w");
fputs($fp, $s);
fclose($fp);
// page2.php:
// questo è necessario perché unserialize() funzioni correttamente.
include("classa.inc");
Manuale essenziale PHP-MySql
Luciano Viviani 21
$s = implode("", @file("store"));
$a = unserialize($s);
// ora usiamo la function show_one() dell'oggetto $a.
$a->show_one();
?>
Se state usando le sessioni ed usate session_register() per registrare oggetti, questi oggetti vengono
serializzati automaticamente alla fine di ogni pagina PHP e sono deserializzate automaticamente su ogni
pagina della sessione. Ciò significa che gli oggetti possono mostrarsi in ogni pagina e che sono parte
integrante della sessione.
Si suggerisce vivamente di includere le definizioni delle classi degli oggetti registrati su tutte le pagine,
anche se le classi non sono usate su tutte le pagine. Se un oggetto viene deserializzato senza la relativa
definizione della classe, perderà l'associazione ad essa e si trasformerà in un oggetto della classe stdClass
senza nessuna funzione disponibile, diventando inutile.
Così se nell'esempio qui sopra $a diventasse parte di una sessione e fosse registrato con
session_register("a"), dovreste includere un file classa.inc su tutte le pagine in cui è valida la
sessione, non soltanto nella page1.php e nella page2.php.
Le funzioni magiche __sleep e __wakeup
serialize() controlla se la vostra classe ha una funzione dal nome magico __sleep. In caso
affermativo, quella funzione viene eseguita prima di qualsiasi serializzazione. La funzione può pulire
l'oggetto e restituire un array con i nomi di tutte le variabili di quell' oggetto che dovrebbero essere
serializzate.
Si intende usare __sleep quando chiudendo un collegamento ad un database l'oggetto può avere dati
pendenti e l'oggetto ha bisogno di essere ripulito. Inoltre, la funzione è utile se avete oggetti molto grandi che
non devono essere salvati completamente.
Per contro, unserialize() controlla per vedere se c'è nella classe una funzione dal nome magico
__wakeup. Se è presente questa funzione può ricostruire qualunque risorsa che l'oggetto aveva.
L'intento di __wakeup è quello di ristabilire le connessioni ai database che possono esser state persi durante
la serializzazione ed effettuare altre mansioni reinizializzazione.
Confronto di oggetti in PHP 4
In PHP 4, gli oggetti sono confrontati semplicemente, cioè: due istanze di oggetto sono uguali se hanno gli
stessi attributi e valori, e sono istanze della stessa classe. Questa regola regola è applicata anche nel
confronto di due oggetti utilizzando l'operatore di identità (===).
<?php
function bool2str($bool) {
if ($bool === false) {
return 'FALSE';
} else {
return 'TRUE';
}
}
function compareObjects(&$o1, &$o2) {
echo 'o1 == o2 : '.bool2str($o1 == $o2)."\n";
echo 'o1 != o2 : '.bool2str($o1 != $o2)."\n";
echo 'o1 === o2 : '.bool2str($o1 === $o2)."\n";
echo 'o1 !== o2 : '.bool2str($o1 !== $o2)."\n";
}
class Flag {
var $flag;
function Flag($flag=true) {
$this->flag = $flag;
}
}
class SwitchableFlag extends Flag {
function turnOn() {
$this->flag = true;
}
function turnOff() {
Manuale essenziale PHP-MySql
Luciano Viviani 22
$this->flag = false;
}
}
$o = new Flag();
$p = new Flag(false);
$q = new Flag();
$r = new SwitchableFlag();
echo "Confronto di istanze create con gli stessi parametri\n";
compareObjects($o, $q);
echo "\nConfronto di istanze create con parametri diversi\n";
compareObjects($o, $p);
echo "\nConfronto di un'istanza della classe genitore con una
sottoclasse\n";
compareObjects($o, $r);
?>
Si ha: Confronto di istanze create con gli stessi parametri
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE
Confronto di istanze create con parametri diversi
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE
Confronto di un'istanza della classe genitore con una sottoclasse
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE
Questo è l'output che si ottiene secondo le regole di confronto descritte sopra. Solo le istanze con gli stessi
valori per gli attributi e derivanti dalla stessa classe sono considerate uguali ed identiche.
Funzioni MySQL
|