1. Differenza tra Proprietà Backed e Proprietà Virtuali
Proprietà Backed
Le proprietà backed sono le proprietà dichiarate esplicitamente nella classe.
class BlogData
{
public readonly string $title;
public readonly Status $status;
public function __construct(string $title, Status $status)
{
$this->title = $title;
$this->status = $status;
}
}
- Dichiarazione Esplicita: Le proprietà backed vengono dichiarate usando le parole chiave
public,protectedoprivatenella classe. - Memorizzazione Diretta: Il valore della proprietà è memorizzato direttamente in memoria e si accede tramite
->.
echo $blogData->title; - Comportamento Automatico: PHP gestisce automaticamente le operazioni di lettura e scrittura a meno che non siano sovrascritte con metodi come
__get()o__set(). - Tipizzazione: Le dichiarazioni di tipo garantiscono che solo dati compatibili possano essere assegnati.
- Prestazioni: Accesso più rapido perché i dati sono memorizzati direttamente in memoria.
Proprietà Virtuali
Le proprietà virtuali non sono dichiarate esplicitamente nella classe.
Possono essere assegnate e lette direttamente utilizzando la sintassi (deprecata) $obj->virtualProperty1 = 3;; oppure possono essere simulate utilizzando metodi magici di php __get() e __set().
Proprietà Virtuali con i metodi magici di php __get() e __set()
- Nessuna Dichiarazione Esplicita: Le proprietà virtuali non sono dichiarate ma vengono implementate dinamicamente tramite metodi magici.
- Comportamento Dinamico: I metodi
__gete__setpossono includere logica per manipolare o validare i dati durante l’accesso o l’assegnazione. - Memorizzazione: Il valore della proprietà non viene automaticamente memorizzato, tipicamente viene memorizzato ad es. in una proprietà dell’oggetto di tipo array ed
$dati). - Logica Personalizzata: Offrono flessibilità per aggiungere comportamenti come validazione, logging o caricamento ritardato.
- Prestazioni: Più lente delle proprietà backed a causa dell’overhead dovuto ai metodi magici.
| Caratteristica | Proprietà Backed | Proprietà Virtuali |
|---|---|---|
| Dichiarazione | Esplicita nella classe | Non dichiarata, simulata |
| Memorizzazione | Diretta nella memoria dell’oggetto | Personalizzata (es. array interno) |
| Velocità di Accesso | Più veloce | Più lenta (overhead dei metodi magici) |
| Tipizzazione | Gestita automaticamente da PHP | Deve essere implementata manualmente |
Quando si utilizzano i metodi magici `__get()` e `__set()`, si definisce un comportamento personalizzato per leggere e scrivere proprietà che non sono dichiarate esplicitamente nella classe.
- Controllo personalizzato: È possibile aggiungere logica durante l’accesso o l’assegnazione di proprietà, ad esempio validazione, logging o calcoli dinamici.
- Overhead maggiore: Ogni accesso o modifica richiede l’esecuzione di un metodo magico, con un leggero costo in termini di prestazioni.
class User {
private $data = array();
public function __set(string $prop, $value): void {
switch ($prop) {
case 'name':
if (!is_string($value)) {
throw new TypeError("Name must be a string");
}
if (strlen($value) === 0) {
throw new ValueError("Name must be non-empty");
}
break;
}
$this->data[$prop] = $valore;
}
public function __get($prop) {
return @$this->data[$prop];
}
}
$obj = new User();
if (!isset($obj->name)) {
$obj->name = "Giacomo";
}
echo $obj->name; // Giacomo
Assegnazione Dinamica Diretta
Se la classe non definisce esplicitamente proprietà e non implementa i metodi magici, PHP permette di creare proprietà pubbliche dinamiche semplicemente assegnandole utilizzando la sintassi (deprecata) $obj->virtualProperty1 = 3;.
- Nessun controllo: L’assegnazione e l’accesso sono diretti, senza possibilità di validare o manipolare i dati.
- Isolato al singolo oggetto: Le proprietà create in questo modo sono specifiche dell’istanza.
- Prestazioni più veloci: Non essendo invocati metodi, l’operazione è più veloce rispetto ai metodi magici.