Menu
Coddy logo textTech

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

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

Ключевой момент: Используйте свойства экземпляра, когда каждому объекту требуется собственное значение. Используйте статические свойства, когда вам нужно совместно использовать данные во всех объектах класса, например, для подсчета экземпляров или хранения конфигурации.

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

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

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