W3docs

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.

Практика

Практика
Каковы ключевые характеристики класса в PHP?
Каковы ключевые характеристики класса в PHP?
Was this page helpful?