Proprietà Backed vs Proprietà Virtuali in PHP


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, protected o private nella 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 __get e __set possono 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *