Menu
Coddy logo textTech

Свойства экземпляра и статические свойства

Часть раздела Объектно-ориентированное программирование путешествия по 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, например для подсчёта экземпляров или хранения конфигурации.

challenge icon

Задание

Легко

Создадим систему отслеживания посетителей, которая демонстрирует разницу между свойствами экземпляра (уникальными для каждого посетителя) и статическими свойствами (общими для всех посетителей).

Ты создашь два файла, чтобы организовать свой код:

  • 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
?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор PHP