class
Узнайте, как ключевое слово class в PHP определяет классы: свойства, методы, конструкторы, модификаторы доступа, константы, статические члены и наследование.
Ключевое слово class в PHP
Ключевое слово class определяет класс — шаблон, описывающий данные (свойства) и поведение (методы), общие для группы объектов. Затем вы создаёте отдельные объекты (также называемые экземплярами) из этого шаблона с помощью оператора new. Классы — это основа объектно-ориентированного программирования (ООП) в PHP: они позволяют группировать связанные состояние и логику в единый, повторно используемый блок вместо разрозненных переменных и функций.
На этой странице рассматривается, как объявить класс, добавить свойства и методы, инициализировать объекты с помощью конструктора, управлять доступом с помощью модификаторов видимости, совместно использовать данные с константами и статическими членами, а также повторно использовать поведение через наследование.
Синтаксис
Объявление класса начинается с ключевого слова class, за которым следуют имя и тело в фигурных скобках:
<?php
class MyClass {
// Properties and methods go here
}По соглашению имена классов используют PascalCase (MyClass, BankAccount). Имя класса не может быть зарезервированным словом PHP, а тело — даже пустое — должно быть заключено в фигурные скобки. Само по себе определение класса ничего не делает; оно становится полезным только после создания объекта из него.
Свойства и методы
Свойство — это переменная, принадлежащая объекту. Метод — это функция, принадлежащая классу. Внутри метода специальная переменная $this ссылается на текущий объект, поэтому $this->name читает (или записывает) свойство name этого объекта:
<?php
class User {
public string $name; // a property
public function greet(): string { // a method
return "Hi, I'm {$this->name}";
}
}
$u = new User();
$u->name = "Ada"; // set the property on this object
echo $u->greet(); // Hi, I'm AdaОбратите внимание на стрелку -> (не .) для доступа к членам, и что вы пишете $this->name, но никогда $this->$name.
Конструктор
Устанавливать каждое свойство вручную — многословно и чревато ошибками. Метод __construct() запускается автоматически при создании объекта, позволяя вам требовать и присваивать начальные значения за один шаг. Аргументы, передаваемые в new, передаются конструктору:
<?php
class Car
{
public $make;
public $model;
public $year;
public function __construct($make, $model, $year)
{
$this->make = $make;
$this->model = $model;
$this->year = $year;
}
public function describe(): string
{
return "{$this->year} {$this->make} {$this->model}";
}
}
$myCar = new Car("Ford", "Mustang", 2022);
echo $myCar->describe(); // 2022 Ford MustangПодробнее см. конструктор PHP, включая продвижение свойств конструктора.
Видимость
Каждое свойство и метод имеет видимость, которая определяет, откуда к ним можно получить доступ:
public— доступно откуда угодно (по умолчанию, если не указано).protected— доступно только внутри класса и его подклассов.private— доступно только внутри класса, в котором объявлено.
Сокрытие внутреннего состояния за private и предоставление доступа к нему через методы называется инкапсуляцией:
<?php
class BankAccount
{
private float $balance = 0; // cannot be touched directly from outside
public function deposit(float $amount): void
{
$this->balance += $amount;
}
public function getBalance(): float
{
return $this->balance;
}
}
$acc = new BankAccount();
$acc->deposit(100);
echo $acc->getBalance(); // 100Подробнее в модификаторах доступа PHP.
Константы и статические члены
Используйте ключевое слово const для значений, которые никогда не меняются, и ключевое слово static для данных и методов, принадлежащих самому классу, а не какому-либо отдельному объекту. Доступ к обоим осуществляется с помощью оператора разрешения области видимости :::
<?php
class Circle
{
const PI = 3.14159; // class constant
public static int $count = 0; // shared across all instances
public function __construct()
{
self::$count++; // increment the shared counter
}
}
new Circle();
new Circle();
echo Circle::PI; // 3.14159
echo PHP_EOL;
echo Circle::$count; // 2См. константы класса PHP и статические методы PHP.
Наследование
Класс может использовать extends для расширения другого класса, повторно используя и специализируя его поведение. Дочерний класс наследует свойства и методы родителя и может их переопределять:
<?php
class Animal
{
public function speak(): string
{
return "The animal makes a sound.";
}
}
class Dog extends Animal
{
public function speak(): string // overrides the parent method
{
return "The dog barks.";
}
}
echo (new Animal())->speak(); // The animal makes a sound.
echo PHP_EOL;
echo (new Dog())->speak(); // The dog barks.Для более глубокого изучения см. наследование PHP, а для классов, определяющих контракт без реализации, — абстрактные классы и интерфейсы.
Полный пример
Следующий запускаемый пример сочетает конструктор с методами-геттерами и демонстрирует наследование с переопределением методов:
<?php
// Example 1
class Car
{
public $make;
public $model;
public $year;
public function __construct($make, $model, $year)
{
$this->make = $make;
$this->model = $model;
$this->year = $year;
}
public function getMake()
{
return $this->make;
}
public function getModel()
{
return $this->model;
}
public function getYear()
{
return $this->year;
}
}
$myCar = new Car("Ford", "Mustang", 2022);
echo "Make: " . $myCar->getMake() . PHP_EOL;
echo "Model: " . $myCar->getModel() . PHP_EOL;
echo "Year: " . $myCar->getYear() . PHP_EOL;
// Output:
// Make: Ford
// Model: Mustang
// Year: 2022
// Example 2
class Animal
{
public function speak()
{
echo "The animal speaks.";
}
}
class Dog extends Animal
{
public function speak()
{
echo "The dog barks.";
}
}
$myAnimal = new Animal();
$myDog = new Dog();
$myAnimal->speak();
$myDog->speak();
// Output:
// The animal speaks.
// The dog barks.Пример 1 создаёт объекты с помощью конструктора и читает их состояние через геттеры; Пример 2 показывает подкласс Dog, переопределяющий метод speak(), унаследованный от Animal.
Итоги
- Ключевое слово
classопределяет шаблон; операторnewсоздаёт из него объекты. - Свойства хранят данные объекта, методы определяют его поведение, а
$thisвнутри метода ссылается на текущий объект. __construct()инициализирует объект в момент его создания.public,protectedиprivateуправляют тем, откуда можно получить доступ к членам.constиstaticпринадлежат самому классу; обращайтесь к ним через::.extendsпозволяет одному классу наследовать и переопределять поведение другого.
Для более широкого понимания того, как эти части соотносятся друг с другом, см. классы и объекты PHP.