Свойства экземпляра и статические свойства
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 15 из 91.
Когда вы создаёте property в class, нужно решить, принадлежит ли оно каждому отдельному объекту или самому class. Это различие между instance properties и static properties.
Свойства экземпляра используются по умолчанию. Каждый объект получает собственную копию свойства, и его изменение в одном объекте не влияет на другие:
<?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";
Вывод:
Alice
Bob
Статические свойства принадлежат class, а не какому-либо конкретному объекту. Вы объявляете их с помощью ключевого слова static и обращаетесь к ним, используя имя class с :: вместо объекта с ->:
<?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;
Вывод:
2
Обратите внимание, как $count является общей для всех экземпляров. Каждый раз, когда мы создаём новый User, одна и та же переменная $count увеличивается. Внутри класса мы используем self::$count, чтобы обратиться к static property.
Ключевой момент: Используй instance properties, когда каждому объекту нужно own значение. Используй static properties, когда нужно совместно использовать данные между all объектами class, например для подсчёта экземпляров или хранения конфигурации.
Задание
ЛегкоСоздадим систему отслеживания посетителей, которая демонстрирует разницу между свойствами экземпляра (уникальными для каждого посетителя) и статическими свойствами (общими для всех посетителей).
Ты создашь два файла, чтобы организовать свой код:
Visitor.php: Определи классVisitor, который отслеживает отдельных посетителей и ведёт текущий подсчёт общего числа посетителей. У каждого посетителя должно быть собственное свойство$name(свойство экземпляра), тогда как свойство$totalVisitorsдолжно быть общим для всех экземпляров (статическое свойство). Конструктор принимает имя, задаёт его и увеличивает общее число посетителей. Добавь методgetInfo(), который возвращает"[name] is visitor #[totalVisitors]".main.php: Подключи файл класса Visitor, затем создай трёх посетителей с именами"Alice","Bob"и"Charlie"(именно в таком порядке). После создания всех троих выведи результат вызоваgetInfo()для каждого посетителя (каждый результат — в отдельной строке), затем выведи общее число посетителей, напрямую обратившись к статическому свойству класса черезVisitor::$totalVisitors.
Помни, что внутри класса статические свойства доступны через self::$propertyName, а за пределами класса используется ClassName::$propertyName. К свойствам экземпляра обычно обращаются с помощью $this->propertyName.
В выводе каждый посетитель должен отображаться с присвоенным ему номером, а в последней строке должно быть указано итоговое общее количество.
Попробуйте сами
<?php
// Подключить класс Visitor
require_once 'Visitor.php';
// TODO: Создать трёх посетителей с именами "Alice", "Bob" и "Charlie" (в этом порядке)
// TODO: Вывести результат getInfo() для каждого посетителя (каждый на своей строке)
// TODO: Вывести общее количество посетителей, используя Visitor::$totalVisitors
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP