⊗ppOpIfSII 73 of 107 menu

Multiple Interfaces in OOP in PHP

PHP does not have multiple inheritance - each class can have only one parent. However, with interfaces, things are different: each class can implement any number of interfaces. To do this, the interface names need to be listed after the keyword implements, separated by commas.

This demonstrates another difference between interfaces and abstract classes - you can implement many interfaces, but you cannot inherit from several abstract classes.

Let's try it in practice. Suppose that besides the interface iFigure we also have an interface iTetragon. The methods of this interface will be implemented by the classes Quadrate and Rectangle, since they have 4 sides, but not the class Disk.

Let the interface iTetragon describe getters for all four sides of a quadrilateral:

<?php interface iTetragon { public function getA(); public function getB(); public function getC(); public function getD(); } ?>

Suppose we also have the interface iFigure, which we created earlier:

<?php interface iFigure { public function getSquare(); public function getPerimeter(); } ?>

Let's make the class Quadrate implement two interfaces. To do this, we list both interfaces after the keyword implements, separated by a comma:

<?php class Quadrate implements iFigure, iTetragon { // implementation will be here } ?>

Now let's finalize our class Quadrate, so that it implements the interface iTetragon. It is clear that our square is a degenerate case of a quadrilateral, because a square has all sides equal. Therefore, all new methods will return the same thing - the width of the square:

<?php class Quadrate implements iFigure, iTetragon { private $a; public function __construct($a) { $this->a = $a; } public function getA() { return $this->a; } public function getB() { return $this->a; } public function getC() { return $this->a; } public function getD() { return $this->a; } public function getSquare() { return $this->a * $this->a; } public function getPerimeter() { return 4 * $this->a; } } ?>

Obviously, in a rectangle, not all sides are the same, only the opposite ones are. In this case, the new methods will be slightly different. Well, and in some trapezoid, all 4 sides will be completely different.

However, it doesn't matter what kind of figure we are considering - what is important is that all these figures will have the described methods (even if some figures are degenerate) and work in a uniform way.

Make the class Rectangle also implement two interfaces: both iFigure, and iTetragon.

Create an interface iCircle with methods getRadius and getDiameter.

Make the class Disk also implement two interfaces: both iFigure, and iCircle.

byenru