Proprietà di istanza e statiche
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 15 di 91.
Quando crei una proprietà in una classe, devi decidere se appartiene a ogni singolo oggetto o alla classe stessa. Questa distinzione è la differenza tra proprietà di istanza e proprietà statiche.
Le proprietà di istanza sono quelle predefinite. Ogni oggetto riceve una propria copia della proprietà e modificarla in un oggetto non influisce sugli altri:
<?php
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo $alice->name . "\n";
echo $bob->name . "\n";
Output:
Alice
Bob
Le proprietà statiche appartengono alla classe, non a un oggetto specifico. Le dichiari con la parola chiave static e vi accedi usando il nome della classe con :: invece di un oggetto con ->:
<?php
class User {
public static $count = 0;
public $name;
public function __construct($name) {
$this->name = $name;
self::$count++;
}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo User::$count;
Output:
2
Nota come $count sia condiviso tra tutte le istanze. Ogni volta che creiamo un nuovo User, la stessa variabile $count viene incrementata. All'interno della classe, usiamo self::$count per fare riferimento alla proprietà statica.
Punto chiave: Usa le proprietà di istanza quando ogni oggetto ha bisogno di un proprio valore. Usa le proprietà statiche quando devi condividere dati tra tutti gli oggetti di una classe, ad esempio per contare le istanze o memorizzare la configurazione.
Sfida
FacileCostruiamo un sistema di tracciamento dei visitatori che mostri la differenza tra le proprietà di istanza (uniche per ogni visitatore) e le proprietà statiche (condivise da tutti i visitatori).
Creerai due file per organizzare il codice:
Visitor.php: definisci una classeVisitorche tiene traccia dei singoli visitatori e mantiene un conteggio progressivo del totale dei visitatori. Ogni visitatore deve avere una propria proprietà$name(proprietà di istanza), mentre una proprietà$totalVisitorsdeve essere condivisa tra tutte le istanze (proprietà statica). Il costruttore accetta un nome, lo assegna e incrementa il conteggio totale dei visitatori. Aggiungi un metodogetInfo()che restituisca"[name] is visitor #[totalVisitors]".main.php: includi il file della classe Visitor, poi crea tre visitatori con i nomi"Alice","Bob"e"Charlie"(in quest'ordine). Dopo averli creati tutti e tre, stampa il risultato della chiamata agetInfo()su ciascun visitatore (ognuno su una riga distinta), poi stampa il conteggio totale dei visitatori accedendo direttamente alla proprietà statica dalla classe tramiteVisitor::$totalVisitors.
Ricorda che all'interno della classe si accede alle proprietà statiche usando self::$propertyName, mentre dall'esterno della classe si usa ClassName::$propertyName. Come di consueto, si accede alle proprietà di istanza con $this->propertyName.
L'output dovrebbe mostrare ciascun visitatore con il numero assegnatogli, seguito dal conteggio totale finale sull'ultima riga.
Provalo tu
<?php
// Includi la classe Visitor
require_once 'Visitor.php';
// TODO: Crea tre visitatori con i nomi "Alice", "Bob" e "Charlie" (in quest'ordine)
// TODO: Stampa il risultato di getInfo() per ogni visitatore (ciascuno su una riga separata)
// TODO: Stampa il numero totale di visitatori usando Visitor::$totalVisitors
?>Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online