Классы в PHP – объявление, свойства, методы и конструкторы
Классы в PHP объединяют данные и действия над ними. Вы объявите класс со свойствами и методами, создадите объект через new. Затем добавите типизированный конструктор и закроете внутренние данные через private.
Также разберете деструктор, наследование, статические члены и типичные ошибки.
Классы в PHP – определение и использование
Класс описывает устройство объекта: свойства хранят состояние, методы выполняют действия. Объявление начинается с ключевого слова class.
<?php
class User
{
public string $name;
public int $age;
public function describe(): string
{
return $this->name . " is " . $this->age . " years old";
}
}Типизированное свойство задает ожидаемый тип значения. PHP может неявно привести совместимое скалярное значение к нужному типу. Строгий режим меняет правила такого приведения.
Свойство $name хранит имя, а $age – возраст. Переменная $this ссылается на текущий объект. Оператор -> обращается к его свойству или методу.
Создайте объект после объявления класса и заполните его свойства:
$user = new User();
$user->name = "John Doe";
$user->age = 42;
echo $user->describe();Код выведет строку John Doe is 42 years old. Имя метода написано в camelCase, как принято в стандартах именования PHP.
Синтаксис объявления класса описан в документации PHP о классах и объектах.
Примеры с повторным объявлением User или Counter запускайте отдельно. PHP не позволяет объявить одноименный класс повторно в одном пространстве имен. В файлах только с PHP-кодом закрывающий тег опускайте.
Области видимости свойств и методов
Модификатор доступа определяет, откуда код обращается к члену класса. Выбирайте уровень по роли данных. Оставляйте внешнему коду только нужные операции.
Public: открытый интерфейс объекта
public открывает свойство или метод классу, его наследникам и внешнему коду.
class Counter
{
public int $value = 0;
public function increment(): void
{
$this->value++;
}
}
$counter = new Counter();
$counter->increment();
echo $counter->value;Private: данные только внутри класса
private закрывает свойство от внешнего кода и наследников. Дайте доступ через публичный метод. Так объект сможет контролировать чтение или изменение значения.
class UserProfile
{
private string $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
}
$profile = new UserProfile("John Doe");
echo $profile->getName();Метод getName() скрывает способ хранения имени от внешнего кода.
Protected: доступ классу и наследникам
protected открывает свойство классу и наследникам, запрещая прямой доступ извне.
class AdminProfile extends UserProfile
{
protected string $role = "admin";
public function getRole(): string
{
return $this->role;
}
}Правила доступа описаны в документации PHP об областях видимости.
Конструктор с параметрами
Конструктор __construct() запускается при создании объекта. Передайте в него обязательные данные и присвойте их типизированным свойствам.
class Animal
{
public string $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
$animal = new Animal("Bob the Dog");
echo $animal->name;Вызов new Animal("Bob the Dog") создает объект и передает строку конструктору. После этого свойство $name содержит переданное имя.
Продвижение параметров конструктора
PHP 8 позволяет объявить свойство прямо в списке параметров. Такой синтаксис сокращает класс и сохраняет типизацию.
class Product
{
public function __construct(
private string $name,
private int $price
) {
}
public function getName(): string
{
return $this->name;
}
public function getPrice(): int
{
return $this->price;
}
}
$product = new Product("Notebook", 50000);
echo $product->getName();PHP создает свойства и присваивает им аргументы конструктора. Такой синтаксис называют продвижением параметров конструктора. Его правила приведены в документации PHP о конструкторах.
Readonly-свойства
Ключевое слово readonly запрещает повторное изменение свойства после инициализации. Оно подходит для идентификаторов и других значений, получаемых один раз.
class Order
{
public function __construct(
public readonly int $id,
private string $status
) {
}
public function getStatus(): string
{
return $this->status;
}
}
$order = new Order(10, "new");
echo $order->id;Попытка присвоить другое значение $order->id завершится ошибкой. Readonly-свойства доступны начиная с PHP 8.1.
Деструктор и время уничтожения объекта
Деструктор __destruct() запускается после потери последней ссылки на объект. Последнюю ссылку могут удалить unset() или присвоение переменной значения null. Выход из области видимости тоже может освободить объект. PHP также вызывает деструкторы оставшихся объектов при завершении скрипта.
class Connection
{
public function __destruct()
{
echo "Connection closed";
}
}
$connection = new Connection();
unset($connection);В этом примере unset($connection) удаляет последнюю ссылку на объект. PHP вызывает деструктор, который выводит Connection closed.
Сборщик мусора освобождает объекты с циклическими ссылками, недоступные остальному коду.
Конструктор и деструктор: сравнение
Оба магических метода связаны с жизненным циклом объекта. Конструктор готовит объект к работе, а деструктор выполняет завершающие действия.
| Метод | Когда вызывается | Принимает параметры | Типичное применение |
__construct() | При создании через new | Да | Заполнение свойств и проверка входных данных |
__destruct() | После потери последней ссылки или при завершении скрипта | Нет | Закрытие ресурса или запись финального состояния |
Ошибки при работе с классами и объектами
Ошибки появляются при обращении к отсутствующему объекту или закрытому свойству. Пропущенные аргументы и неверная запись свойства тоже мешают выполнению. Сопоставьте сообщение PHP с проблемной строкой и исправьте обращение.
Обращение к свойству без $this
В методе обращайтесь к свойству объекта через $this->. PHP читает отдельное name как имя константы.
class User
{
private string $name = "John";
public function getName(): string
{
return name;
}
}В PHP 8 вызов метода приведет к ошибке Undefined constant "name". Исправьте возврат на return $this->name;. Метод прочитает значение свойства текущего объекта.
Вызов метода у неинициализированного объекта
Переменная со значением null не содержит объект. Вызов getName() у нее завершится ошибкой:
$user = null;
echo $user->getName();Основной текст сообщения PHP – Call to a member function getName() on null. Создайте объект до вызова метода:
$user = new UserProfile("John Doe");
echo $user->getName();Исправленный код выведет John Doe.
Доступ к private-свойству снаружи
Попытка прочитать private-свойство из внешнего кода завершится ошибкой:
$profile = new UserProfile("John Doe");
echo $profile->name;Основной текст сообщения PHP – Cannot access private property UserProfile::$name.
Используйте публичный метод доступа: echo $profile->getName();. Так класс сохраняет контроль над своим состоянием.
Забытый аргумент конструктора
Если конструктор требует аргумент, передайте его при создании объекта. Вызов без имени приведет к ошибке:
$animal = new Animal();Сообщение содержит путь к файлу и номер проблемной строки. Например, для вызова в /app/example.php на строке 12 текст выглядит так:
Too few arguments to function Animal::__construct(), 0 passed in /app/example.php on line 12 and exactly 1 expectedПуть и номер строки в вашем сообщении будут соответствовать вашему файлу.
Исправьте вызов и передайте строковое имя: $animal = new Animal("Bob the Dog");. Теперь echo $animal->name; выведет Bob the Dog.
Наследование и статические члены
Наследование помогает расширить готовый класс. Статические члены хранят данные и операции на уровне самого класса. Эти возможности пригодятся после освоения объектов.
Наследование через extends
Наследник получает доступные свойства и методы родителя через extends. Вызов parent::__construct() запускает конструктор родительского класса.
class Admin extends UserProfile
{
public function __construct(string $name)
{
parent::__construct($name);
}
}Наследование и переопределение методов описаны в документации PHP о наследовании.
Статические свойства и методы
Статическое свойство хранит общее значение на уровне класса. Статический метод можно вызвать без создания объекта. Внутри него self:: позволяет обратиться к статическим членам класса.
class Counter
{
private static int $total = 0;
public static function add(): void
{
self::$total++;
}
public static function getTotal(): int
{
return self::$total;
}
}
Counter::add();
echo Counter::getTotal();Оператор :: обращается к статическому члену: Counter::add() вызывает метод класса.
Выражение self::$total читает статическое свойство внутри класса. Синтаксис описан в документации PHP о статических членах.
Начинайте с private-свойств и публичных методов доступа. Так объект сам контролирует чтение и изменение своих данных.
Популярное за неделю
- Как создать сайт самому в 2026: 4 способа + пошаговая инструкция 34 мин чтения
- Лучшие конструкторы для создания сайтов — плюсы, минусы и сравнения 22 мин чтения
- Как сделать редирект на PHP 6 мин чтения
- Основы ООП в PHP: принципы и примеры 6 мин чтения
- Адаптивный помесячный календарь на AJAX и PHP 2 мин чтения
- Как создать формы регистрации и авторизации на PHP 5 мин чтения
Комментарии
хорошая статья