Позднее связывание
Позднее связывание - это процесс вызова методов объекта во время выполнения, а не на этапе компиляции. Это позволяет изменять поведение методов для разных классов, которые наследуют один и тот же метод.
Пример использования позднего связывания для классов Animal, Dog и Cat
class Animal {
public function speak() {
echo "Animal speaks"; // Животное издает звуки
}
}
class Dog extends Animal {
public function speak() {
echo "Dog barks"; // Собака лает
}
}
class Cat extends Animal {
public function speak() {
echo "Cat meows"; // Кошка мяучит
}
}
$animals = [
new Dog(),
new Cat(),
new Animal(),
];
foreach ($animals as $animal) {
$animal->speak(); // Вызываем метод speak у каждого объекта животного
}
В этом примере у нас есть класс Animal
, который имеет метод speak
. Затем у нас есть два класса Dog
и Cat
, которые наследуют метод speak
от Animal
и переопределяют его. Мы также создаем массив объектов, включающих объекты Dog
, Cat
и Animal
, и вызываем метод speak
для каждого объекта в массиве.
В результате выполнения кода мы получим вывод:
Dog barks
Cat meows
Animal speaks
Как мы видим, метод speak
вызывается для каждого объекта, и его поведение зависит от класса объекта.
Пример использования позднего связывания для интерфейса Shape и классов Circle, Rectangle и Triangle
interface Shape {
// Метод для расчета площади фигуры
public function getArea();
}
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function getArea() {
return pi() * pow($this->radius, 2); // Площадь круга
}
}
class Rectangle implements Shape {
private $width;
private $height;
public function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
}
public function getArea() {
return $this->width * $this->height; // Площадь прямоугольника
}
}
class Triangle {
private $base;
private $height;
public function __construct($base, $height) {
$this->base = $base;
$this->height = $height;
}
public function getArea() {
return 0.5 * $this->base * $this->height; // Площадь треугольника
}
}
В этом примере мы создаем интерфейс Shape
, который определяет метод getArea
для расчета площади фигуры. Затем мы создаем классы Circle
и Rectangle
, которые реализуют интерфейс Shape
. У класса Triangle
нет реализации интерфейса Shape
, но он имеет метод getArea
.
$shapes = [
new Circle(2), // Создаем круг с радиусом 2
new Rectangle(3, 4), // Создаем прямоугольник с шириной 3 и высотой 4
new Triangle(3, 4), // Создаем треугольник с основанием 3 и высотой 4
];
foreach ($shapes as $shape) {
echo "Площадь: " . $shape->getArea() . "\\n"; // Выводим площадь каждой фигуры
}
В этом примере мы создаем массив объектов Shape
, включающих объекты Circle
, Rectangle
и Triangle
, и вызываем метод getArea
для каждого объекта. Как мы можем убедиться, метод getArea
вызывается для каждого объекта, и его поведение зависит от класса объекта.
В результате выполнения кода мы получим вывод:
Площадь: 12.566370614359
Площадь: 12
Площадь: 6
Заключение
Позднее связывание - это мощный инструмент, который позволяет использовать один и тот же метод в разных классах и изменять его поведение для каждого класса. Это может быть особенно полезно в случаях, когда у нас есть несколько классов, которые должны выполнять одну и ту же функцию, но с небольшими отличиями в поведении. В PHP позднее связывание реализуется с помощью ключевого слова parent
и методов __call
и __callStatic
.