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ę.
Wyzwanie
ŁatwyZbudujmy 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ść$totalVisitorspowinna 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łaniagetInfo()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
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online