Classi e Oggetti
PHP Manual

Nozioni di base

class

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

new

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)

extends

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

::class

Da PHP 5.5, la parola chiave class è anche usata per la risoluzione del nome della classe. Si può ottenere una stringa contenente il nome completo della classe ClassName utilizzando ClassName::class. Questo è particolarmente utile con le classi presenti nei namespace.

Example #7 Risoluzione del nome della classe

<?php
namespace NS {
    class 
ClassName {
    }
    
    echo 
ClassName::class;
}
?>

Il precedente esempio visualizzerà:

NS\ClassName


Classi e Oggetti
PHP Manual