In PHP, una classe è un modello (o blueprint) che definisce il comportamento e le proprietà che gli oggetti creati da essa avranno. Le classi sono il cuore della programmazione orientata agli oggetti (OOP), paradigma che consente di scrivere codice più modulare, riutilizzabile e organizzato.
Immagina una classe come una struttura concettuale che descrive un oggetto del mondo reale: un’automobile, un utente, un prodotto.
class Automobile {
public $marca;
public $modello;
public function avviaMotore() {
echo "Motore avviato!";
}
}
In questo esempio, la classe Automobile definisce due proprietà (marca e modello) e un metodo (avviaMotore). Ma questo è solo l’inizio.
Oggetti: l’istanza della classe
Una classe da sola non fa nulla finché non viene creata un’istanza, cioè un oggetto.
$miaAuto = new Automobile(); $miaAuto->marca = "Fiat"; $miaAuto->modello = "Panda"; $miaAuto->avviaMotore(); // Output: Motore avviato!
L’oggetto $miaAuto è una istanza della classe Automobile. Ora ha un proprio stato (le proprietà marca e modello) e può eseguire azioni (avviaMotore).
Proprietà e metodi: stati e comportamenti
Proprietà
Le proprietà sono le variabili definite all’interno di una classe. Rappresentano lo stato dell’oggetto.
class Libro {
public $titolo;
public $autore;
}
Metodi
I metodi sono le funzioni contenute in una classe. Definiscono i comportamenti dell’oggetto.
class Libro {
public $titolo;
public $autore;
}
Visibilità: public, private, protected
PHP permette di controllare l’accesso a proprietà e metodi con le parole chiave:
-
public: accessibile ovunque -
private: accessibile solo all’interno della classe -
protected: accessibile nella classe e nelle sue sottoclassi
Esempio pratico:
class Libro {
public $titolo;
public $autore;
public function leggi() {
echo "Stai leggendo '$this->titolo' di $this->autore.";
}
}
Il saldo non può essere modificato direttamente dall’esterno: solo tramite i metodi pubblici. Questo è un principio dell’OOP noto come incapsulamento.
Costruttore: __construct()
Il costruttore è un metodo speciale che viene eseguito automaticamente quando viene creata una nuova istanza della classe.
class Libro {
public $titolo;
public $autore;
public function leggi() {
echo "Stai leggendo '$this->titolo' di $this->autore.";
}
}
Ora possiamo creare un utente più velocemente:
class Utente {
public $nome;
public function __construct($nome) {
$this->nome = $nome;
}
}
Ereditarietà: estendere una classe
PHP supporta l’ereditarietà singola: una classe può ereditare da un’altra.
class Animale {
public function faiVerso() {
echo "Verso generico";
}
}
class Cane extends Animale {
public function faiVerso() {
echo "Bau!";
}
}
$dog = new Cane(); $dog->faiVerso(); // Output: Bau!
Il metodo faiVerso() è stato sovrascritto nella sottoclasse Cane.
Il concetto di $this
Il $this è una variabile speciale che fa riferimento all’istanza corrente dell’oggetto. Serve per accedere a proprietà e metodi all’interno della stessa classe.
public function saluta() {
echo "Ciao, sono $this->nome!";
}
Staticità: proprietà e metodi static
I metodi e le proprietà statiche non richiedono un oggetto per essere utilizzati. Si accede ad essi direttamente dalla classe.
class Matematica {
public static function somma($a, $b) {
return $a + $b;
}
}
echo Matematica::somma(3, 4); // 7
Autoloading e Namespaces
Autoload
Per progetti più complessi, PHP permette il caricamento automatico delle classi con spl_autoload_register() o tramite Composer.
class Matematica {
public static function somma($a, $b) {
return $a + $b;
}
}
echo Matematica::somma(3, 4); // 7
Namespace
Per evitare conflitti tra nomi di classi:
namespace App\Modelli;
class Utente {
// ...
}
Poi puoi usare:
use App\Modelli\Utente;
Tipizzazione delle proprietà e dei parametri
A partire da PHP 7.4 puoi tipizzare le proprietà, mentre da PHP 8 anche i parametri e i ritorni:
class Prodotto {
public string $nome;
public float $prezzo;
public function getPrezzo(): float {
return $this->prezzo;
}
}
Questo migliora l’affidabilità del codice.
Classi astratte e interfacce
Classi astratte
Non possono essere istanziate direttamente, ma servono da base per altre classi.
abstract class Forma {
abstract public function calcolaArea();
}
Interfacce
Definiscono solo i metodi che una classe deve implementare.
interface Spedibile {
public function spedisci($destinazione);
}
Trait: Riutilizzare codice in più classi
PHP non supporta ereditarietà multipla, ma consente di riutilizzare codice con i trait:
trait Logger {
public function log($msg) {
echo "[LOG] $msg";
}
}
class Sistema {
use Logger;
}
