Свойства экземпляра и статические свойства
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 15 из 91.
Когда вы создаете свойство в классе, вам нужно решить, принадлежит ли оно каждому отдельному объекту или самому классу. Это различие и есть разница между свойствами экземпляра и статическими свойствами.
Свойства экземпляра используются по умолчанию. Каждый объект получает свою собственную копию свойства, и изменение его в одном объекте не влияет на другие:
<?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
Статические свойства принадлежат классу, а не какому-либо конкретному объекту. Вы объявляете их с помощью ключевого слова static и обращаетесь к ним, используя имя класса с :: вместо объекта с ->:
<?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 для ссылки на статическое свойство.
Ключевой момент: Используйте свойства экземпляра, когда каждому объекту требуется собственное значение. Используйте статические свойства, когда вам нужно совместно использовать данные во всех объектах класса, например, для подсчета экземпляров или хранения конфигурации.
Задание
ЛегкоДавайте создадим систему отслеживания посетителей, которая демонстрирует разницу между свойствами экземпляра (уникальными для каждого посетителя) и статическими свойствами (общими для всех посетителей).
Вы создадите два файла для организации вашего кода:
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
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo $alice->name; // Alice
echo $bob->name; // Bob
Статические свойства:
Объявляются с помощью ключевого слова static и являются общими для всех экземпляров:
<?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
Доступ к статическим свойствам:
- Внутри класса:
self::$propertyName - Вне класса:
ClassName::$propertyName
Доступ к свойствам экземпляра:
- Внутри класса:
$this->propertyName - Вне класса:
$object->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Подробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy