La definizione più semplice di una classe è composta dal termine class, seguito dal nome della classe, seguito da una coppia di parentesi graffe che racchiudono le definizioni delle proprietà e dei metodi che fanno parte della classe stessa.
Il nome della classe può essere una qualunque etichetta valida che non sia una parola riservata di PHP. Un nome di classe valido inizia con una lettera o un underscore, seguiti da lettere, numeri, o underscores. Questa regola può essere rappresentata dalla seguente espressione regolare: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Una classe può contenere le proprie costanti, variabili (chiamate "proprietà"), e funzioni (chiamate "methods").
Example #1 Semplice definizione di una classe
<?php
class SimpleClass
{
// dichiarazione di proprietà
public $var = 'un valore di default';
// dichiarazione di metodi
public function mostraVar() {
echo $this->var;
}
}
?>
La pseudo-variabile $this è disponibile quando un metodo è invocato dall'interno del contesto di un oggetto. $this è il riferimento all'oggetto stesso (solitamente l'oggetto cui il metodo appartiene, ma eventualmente può riferirsi all'oggetto chiamante se il metodo è invocato staticamente dal contesto di un oggetto secondario).
Example #2 Esempi della pseudo-variabile $this
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this è definito (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this non è definito\n";
}
}
}
class B
{
function bar()
{
// Nota: la seguente operazione darà luogo ad un segnale di Warning se E_STRICT è abilitato.
A::foo();
}
}
$a = new A();
$a->foo();
// Nota: la seguente operazione darà luogo ad un segnale di Warning se E_STRICT è abilitato.
A::foo();
$b = new B();
$b->bar();
// Nota: la seguente operazione darà luogo ad un segnale di Warning se E_STRICT è abilitato.
B::bar();
?>
Il precedente esempio visualizzerà:
$this è definito (A) $this non è definito $this è definito (B) $this non è definito
Per creare un'istanza di una classe, deve essere usata la parola chiave new. Un oggetto sarà sempre creato a meno che la classe abbia un costruttore definito il quale sollevi un' eccezione in caso di errore. Le classi dovrebbero essere definite prima dell'istanziazione (in alcuni casi questo è un requisito).
Se viene usata una stringa contenente il nome di una classe con new, verrà creata una nuova istanza di quella classe. Se la classe appartiene ad un namespace, deve essere utilizzato il suo nome completamente qualificato.
Example #3 Creazione di un'istanza
<?php
$instance = new SimpleClass();
// è anche possibile istanziare una classe il cui nome sia contenuto in una variabile:
$className = 'Foo';
$instance = new $className(); // Foo()
?>
Nel contesto di una classe, è possibile creare un nuovo oggetto con le espressioni new self e new parent.
Quando si assegna un'istanza già creata ad una nuova variabile, la nuova variabile farà riferimento alla stessa istanza cui fa riferimento la variabile originale. Questo stesso comportamento si ha quando vengono passate istanze ad una funzione. Si può ottenere una copia di un oggetto già creato per mezzo della clonazione.
Example #4 Assegnazione di oggetti
<?php
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$istance->var = '$assigned avrà questo valore';
$instance = null; // $instance e $reference diventano null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
Il precedente esempio visualizzerà:
NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned avrà questo valore" }
PHP 5.3.0 ha introdotto due nuovi modi per creare istanze di un oggetto:
Example #5 Creazione di nuovi oggetti
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
Il precedente esempio visualizzerà:
bool(true) bool(true) bool(true)
Una classe può ereditare i metodi e le proprietà di un'altra classe utilizzando la parola chiave extends nella dichiarazione della classe. Non è possibile estendere più di una classe per volta; ogni classe può ereditare da una sola altra classe.
I metodi e le proprietà ereditate possono essere sovrascritte ridichiarandole nella nuova classe con lo stesso nome definito nella classe padre. Questo non sarà comunque possibile se il metodo che si intende ridefinire è stato dichiarato nella classe padre come final. Si può accedere alle proprietà statiche e ai metodi ridefiniti riferendosi ad essi con parent::.
Nel sovrascrivere i metodi, la lista dei parametri dovrebbe rimanere invariata o
PHP genererà un errore di livello E_STRICT
. Ciò non si applica al
costruttore, che consente di sovrascrivere i
parametri.
Example #6 Ereditarietà semplice
<?php
class ExtendClass extends SimpleClass
{
// Ridefinisce il metodo presente in ClasseSemplice
function displayVar()
{
echo "Classe figlia\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
Il precedente esempio visualizzerà:
Classe figlia un valore di default