Интерфейсы

26 Мая 2020 00:43

Интерфейсы предназначены для описания каких-либо общих элементов, используемых в разных классах. Интерфейсы описывают public методы, которые представляют собой только название метода, описание их аргументов и возвращаемый тип. Тело метода в интерфейсе не описывается.

interface CalculateSquare
{
    public function calculateSquare(): float;
}

Чтобы обязать класс реализовать этот интерфейс нужно использовать ключевое слово implements  

class Circle implements CalculateSquare
{
    ...
}

Класс может реализовывать сразу несколько интерфейсов. В таком случае, они перечисляются через запятую.

class Circle implements CalculateSquare, Interface2, Interface3
{
    ...
}

Класс должен реализовывать все методы, которые прописаны в интерфейсе. Если какой-либо метод отсутствует то результатом работы программы будет ошибка.

Для проверки является ли какой-либо объект реализацией какого-то интерфейса или экземпляром какого то класса, используется  ключевое слово instanceof

Пример

<?php

interface CalculateSquare
{
    public function calculateSquare(): float;
}

class Circle implements CalculateSquare
{
    const PI = 3.1416;

    private $r;

    public function __construct(float $r)
    {
        $this->r = $r;
    }

    public function calculateSquare(): float
    {
        return self::PI * ($this->r ** 2);
    }
}

class Rectangle
{
    private $x;
    private $y;

    public function __construct(float $x, float $y)
    {
        $this->x = $x;
        $this->y = $y;
    }

    public function calculateSquare(): float
    {
        return $this->x * $this->y;
    }
}

class Square implements CalculateSquare
{
    private $x;

    public function __construct(float $x)
    {
        $this->x = $x;
    }

    public function calculateSquare(): float
    {
        return $this->x ** 2;
    }
}

$objects = [
    new Square(5),
    new Rectangle(2, 4),
    new Circle(5)
];

foreach ($objects as $object) {
    if ($object instanceof CalculateSquare) {
        echo 'Объект реализует интерфейс CalculateSquare. Площадь: ' . $object->calculateSquare();
        echo '<br>';
    }
}

Результат

Объект реализует интерфейс CalculateSquare. Площадь: 25
Объект реализует интерфейс CalculateSquare. Площадь: 8
Объект реализует интерфейс CalculateSquare. Площадь: 78.54

Функция get_class

get_class($object):string

Возвращает имя класса, к которому принадлежит объект

Пример

<?php

class foo {
    function name()
    {
        echo "Меня зовут " , get_class($this) , "\n";
    }
}

// создание объекта
$bar = new foo();

// внешний вызов
echo "Его имя " , get_class($bar) , "\n";

// внутренний вызов
$bar->name();