Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 classe Visitor che 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à $totalVisitors deve essere condivisa tra tutte le istanze (proprietà statica). Il costruttore accetta un nome, lo assegna e incrementa il conteggio totale dei visitatori. Aggiungi un metodo getInfo() 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 a getInfo() su ciascun visitatore (ognuno su una riga distinta), poi stampa il conteggio totale dei visitatori accedendo direttamente alla proprietà statica dalla classe tramite Visitor::$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
?>
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore PHP online