Menu
Coddy logo textTech

Właściwości instancji a właściwości statyczne

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 15 z 91.

Gdy tworzysz właściwość w klasie, musisz zdecydować, czy należy ona do każdego pojedynczego obiektu, czy do samej klasy. Ta różnica odróżnia właściwości instancji od właściwości statycznych.

Właściwości instancji są domyślne. Każdy obiekt otrzymuje własną kopię właściwości, a jej zmiana w jednym obiekcie nie wpływa na pozostałe:

<?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";

Wynik:

Alice
Bob

Właściwości statyczne należą do klasy, a nie do konkretnego obiektu. Deklarujesz je za pomocą słowa kluczowego static i uzyskujesz do nich dostęp, używając nazwy klasy z :: zamiast obiektu z ->:

<?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;

Wynik:

2

Zauważ, że $count jest współdzielone przez wszystkie instancje. Za każdym razem, gdy tworzymy nowego użytkownika, ta sama zmienna $count zwiększa swoją wartość. Wewnątrz klasy używamy self::$count, aby odwołać się do właściwości statycznej.

Kluczowa kwestia: Używaj właściwości instancji, gdy każdy obiekt potrzebuje własnej wartości. Używaj właściwości statycznych, gdy chcesz współdzielić dane między wszystkimi obiektami klasy, na przykład zliczać instancje lub przechowywać konfigurację.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system śledzenia odwiedzających, który pokazuje różnicę między właściwościami instancji (unikalnymi dla każdego odwiedzającego) a właściwościami statycznymi (wspólnymi dla wszystkich odwiedzających).

Utworzysz dwa pliki, aby uporządkować swój kod:

  • Visitor.php: Zdefiniuj klasę Visitor, która śledzi poszczególnych odwiedzających i przechowuje bieżącą łączną liczbę odwiedzających. Każdy odwiedzający powinien mieć własną właściwość $name (właściwość instancji), natomiast właściwość $totalVisitors powinna być wspólna dla wszystkich instancji (właściwość statyczna). Konstruktor przyjmuje imię, przypisuje je i zwiększa łączną liczbę odwiedzających. Dodaj metodę getInfo(), która zwraca "[name] is visitor #[totalVisitors]".
  • main.php: Dołącz plik z klasą Visitor, a następnie utwórz trzech odwiedzających o imionach "Alice", "Bob" i "Charlie" (w tej kolejności). Po utworzeniu wszystkich trzech wypisz wynik wywołania getInfo() dla każdego odwiedzającego (każdy w osobnym wierszu), a następnie wypisz łączną liczbę odwiedzających, uzyskując bezpośredni dostęp do właściwości statycznej klasy za pomocą Visitor::$totalVisitors.

Pamiętaj, że wewnątrz klasy uzyskujesz dostęp do właściwości statycznych za pomocą self::$propertyName, a poza klasą używasz ClassName::$propertyName. Do właściwości instancji uzyskujesz dostęp za pomocą $this->propertyName, tak jak zwykle.

Wynik powinien pokazywać każdego odwiedzającego z przypisanym mu numerem, a w ostatnim wierszu końcową łączną liczbę odwiedzających.

Spróbuj swoich sił

<?php
// Dołącz klasę Visitor
require_once 'Visitor.php';

// TODO: Utwórz trzech odwiedzających o imionach "Alice", "Bob" i "Charlie" (w tej kolejności)

// TODO: Wypisz wynik getInfo() dla każdego odwiedzającego (każdy w osobnej linii)

// TODO: Wypisz łączną liczbę odwiedzających, używając Visitor::$totalVisitors
?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online