Php extend and implement

Интерфейсы в PHP

В этом уроке мы узнаем о другой форме композиции в PHP — интерфейсах. Интерфейсы похожи на абстрактные классы и позволяют нам создавать слабосвязанные приложения.

Что такое интерфейс?

Интерфейсы напоминают абстрактные классы тем, что они включают абстрактные методы, которые должны быть определены в классах, наследуемых от интерфейса.

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

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

Интерфейсы могут содержать методы и / или константы, но не атрибуты. Интерфейсные константы имеют те же ограничения, что и константы класса. Методы интерфейса неявно абстрактны. Интерфейсы определяются с помощью ключевого слова interface , за которым следует имя интерфейса:

Пример

Все методы в интерфейсе являются абстрактными, поэтому они не могут быть реализованы в коде, и ключевое слово abstract не требуется.

В отличие от методов абстрактного класса, которые могут быть публичными или защищенными, все методы интерфейса должны быть только публичными:

Пример

Примечание: Интерфейсы не должны объявлять конструкторы или деструкторы, поскольку это детали реализации на уровне класса.

Как реализовать интерфейс?

Чтобы реализовать интерфейс, нужно создать класс с помощью ключевого слова implements .

Пример

 class Child implements interfaceName < // определяет методы интерфейса и может иметь собственный код >?>

В приведенном ниже примере мы создадим интерфейс для классов, управляющих автомобилями, который передает все свои методы setModel() и getModel() классам, реализующим интерфейс:

Пример

Интерфейсы, как и абстрактные классы, включают абстрактные методы и константы. Однако, в отличие от абстрактных классов, интерфейсы могут иметь только публичные методы и не могут иметь переменных.

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

Пример

 class miniCar implements Car < private $model; public function setModel($name) < $this ->model = $name; > public function getModel() < return $this ->model; > > $car = new miniCar(); $car -> setModel('Mercedes Benz'); echo $car -> getModel(); ?>

Результат выполнения кода:

Реализация нескольких интерфейсов

Мы можем реализовать несколько интерфейсов в одном классе и таким образом обойти закон, запрещающий наследование от более чем одного родительского класса.

В следующем примере класс MyClass реализовывает два интерфейса, разделенных запятыми в объявлении. При этом мы должны объявить все абстрактные методы внутри созданного класса:

Пример

 Interface MyInterface2 < public function myMethod2(); >class MyClass implements MyInterface1, MyInterface2 < public function myMethod1() < echo "Привет "; >public function myMethod2() < echo "Мир!"; >> $obj = new MyClass(); $obj -> myMethod1(); $obj -> myMethod2(); ?>

Результат выполнения кода:

Читайте также:  Алгоритм бентли оттмана python

Как расширить класс и реализовать интерфейс?

Класс может расширять класс, а также реализовывать один или несколько интерфейсов:

Пример

 class ParentClass < public $name; public function __construct($name) < $this ->name = $name; > > class ChildClass extends ParentClass implements MyInterface < function write() < echo $this ->name; > > $child = new ChildClass('Max Maxsimov'); $child -> write(); ?>

Результат выполнения кода:

Примечание: Вы можете расширить только один класс, в то же время вы можете реализовать несколько интерфейсов.

Расширение интерфейсов

Интерфейсы также могут расширять интерфейсы:

Пример

 Interface MyInterface2 extends MyInterface1 < public function myMethod2(); >class MyClass1 implements MyInterface1 < # нужен только этот метод public function myMethod1() <>> class MyClass2 implements MyInterface2 < # должны быть объявлены как myMethod1, так и myMethod2 public function myMethod1() <>public function myMethod2() <> > ?>

Разница между абстрактным классом и интерфейсом

В таблице приведены несколько важных различий между абстрактным классом и интерфейсом:

интерфейс абстрактный класс
код — абстрактные методы
— константы
— абстрактные методы
— константы
— конкретные методы
— конкретные переменные
модификаторы доступа — публичные — публичные
— защищенные
количество родителей Один и тот же класс может реализовывать более 1 интерфейса Дочерний класс может наследовать только от 1 абстрактного класса

Заключение

В этом уроке мы научились создавать и реализовывать интерфейсы, а также узнали о различиях между абстрактными классами и интерфейсами. Щелкните здесь, чтобы закрепить полученные знания на практике.

Источник

Php extend and implement

Object interfaces allow you to create code which specifies which methods a class must implement, without having to define how these methods are implemented. Interfaces share a namespace with classes and traits, so they may not use the same name.

Interfaces are defined in the same way as a class, but with the interface keyword replacing the class keyword and without any of the methods having their contents defined.

All methods declared in an interface must be public; this is the nature of an interface.

In practice, interfaces serve two complementary purposes:

  • To allow developers to create objects of different classes that may be used interchangeably because they implement the same interface or interfaces. A common example is multiple database access services, multiple payment gateways, or different caching strategies. Different implementations may be swapped out without requiring any changes to the code that uses them.
  • To allow a function or method to accept and operate on a parameter that conforms to an interface, while not caring what else the object may do or how it is implemented. These interfaces are often named like Iterable , Cacheable , Renderable , or so on to describe the significance of the behavior.
Читайте также:  Java printstream или printwriter

Interfaces may define magic methods to require implementing classes to implement those methods.

Note:

Although they are supported, including constructors in interfaces is strongly discouraged. Doing so significantly reduces the flexibility of the object implementing the interface. Additionally, constructors are not enforced by inheritance rules, which can cause inconsistent and unexpected behavior.

implements

To implement an interface, the implements operator is used. All methods in the interface must be implemented within a class; failure to do so will result in a fatal error. Classes may implement more than one interface if desired by separating each interface with a comma.

A class that implements an interface may use a different name for its parameters than the interface. However, as of PHP 8.0 the language supports named arguments, which means callers may rely on the parameter name in the interface. For that reason, it is strongly recommended that developers use the same parameter names as the interface being implemented.

Note:

Interfaces can be extended like classes using the extends operator.

Note:

The class implementing the interface must declare all methods in the interface with a compatible signature. A class can implement multiple interfaces which declare a method with the same name. In this case, the implementation must follow the signature compatibility rules for all the interfaces. So covariance and contravariance can be applied.

Constants

It’s possible for interfaces to have constants. Interface constants work exactly like class constants. Prior to PHP 8.1.0, they cannot be overridden by a class/interface that inherits them.

Examples

Example #1 Interface example

// Declare the interface ‘Template’
interface Template
public function setVariable ( $name , $var );
public function getHtml ( $template );
>

// Implement the interface
// This will work
class WorkingTemplate implements Template
private $vars = [];

public function setVariable ( $name , $var )
$this -> vars [ $name ] = $var ;
>

public function getHtml ( $template )
foreach( $this -> vars as $name => $value ) $template = str_replace ( » , $value , $template );
>

// This will not work
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (Template::getHtml)
class BadTemplate implements Template
private $vars = [];

public function setVariable ( $name , $var )
$this -> vars [ $name ] = $var ;
>
>
?>

Example #2 Extendable Interfaces

interface B extends A
public function baz ( Baz $baz );
>

// This will work
class C implements B
public function foo ()
>

public function baz ( Baz $baz )
>
>

// This will not work and result in a fatal error
class D implements B
public function foo ()
>

Example #3 Variance compatibility with multiple interfaces

class Foo <>
class Bar extends Foo <>

interface A public function myfunc ( Foo $arg ): Foo ;
>

interface B public function myfunc ( Bar $arg ): Bar ;
>

Читайте также:  Php красиво вывести дату

class MyClass implements A , B
public function myfunc ( Foo $arg ): Bar
return new Bar ();
>
>
?>

Example #4 Multiple interface inheritance

interface B
public function bar ();
>

interface C extends A , B
public function baz ();
>

class D implements C
public function foo ()
>

Example #5 Interfaces with constants

// Prints: Interface constant
echo A :: B ;

class B implements A
const B = ‘Class constant’ ;
>

// Prints: Class constant
// Prior to PHP 8.1.0, this will however not work because it was not
// allowed to override constants.
echo B :: B ;
?>

Example #6 Interfaces with abstract classes

interface A
public function foo ( string $s ): string ;

public function bar ( int $i ): int ;
>

// An abstract class may implement only a portion of an interface.
// Classes that extend the abstract class must implement the rest.
abstract class B implements A
public function foo ( string $s ): string
return $s . PHP_EOL ;
>
>

class C extends B
public function bar ( int $i ): int
return $i * 2 ;
>
>
?>

Example #7 Extending and implementing simultaneously

// The keyword order here is important. ‘extends’ must come first.
class Two extends One implements Usable , Updatable
/* . */
>
?>

An interface, together with type declarations, provides a good way to make sure that a particular object contains particular methods. See instanceof operator and type declarations.

Источник

Наследование от класса и реализация интерфейса

Класс может наследовать от другого класса и при этом реализовывать какой-то интерфейс. Рассмотрим на практическом примере.

Пусть мы хотим сделать класс Programmer , у которого будет имя, зарплата и список языков, которые знает программист.

Пока наше описание класса весьма расплывчато: да, в классе будет имя, зарплата, языки — но какие методы будут в нашем классе?

Давайте более точно опишем наш класс с помощью интерфейса iProgrammer :

Пусть мы покопались в уже реализованных нами классах и, оказывается, у нас уже есть похожий класс Employee . Он реализует не все методы класса Programmer , но часть. Вот код уже существующего у нас класса:

Логично в нашем случае сделать так, чтобы наш новый класс Programmer унаследовал часть необходимых себе методов от класса Employee (а часть мы потом реализуем уже в самом новом классе):

При этом нам известно, что класс Pogrammer должен реализовывать интерфейс iProgrammer :

Давайте совместим наследование от класса Employee и реализацию интерфейса iProgrammer :

Получится, что наш класс Pogrammer унаследует от класса Employee методы __construct , getName и getSalary , а методы addLang и getLangs нам придется реализовать:

Интерфейсу iProgrammer все равно, родные методы у класса или унаследованные — главное, чтобы все описанные методы были реализованы.

Скопируйте код моего класса Employee и код интерфейса iProgrammer . Не копируйте мою заготовку класса Programmer — не подсматривая в мой код реализуйте этот класс самостоятельно.

Источник

Оцените статью