Const in interface php

Const in interface php

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

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

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

На практике интерфейсы используются в двух взаимодополняющих случаях:

  • Чтобы позволить разработчикам создавать объекты разных классов, которые могут использоваться взаимозаменяемо, поскольку они реализуют один и тот же интерфейс или интерфейсы. Типичный пример — несколько служб доступа к базе данных, несколько платёжных шлюзов или разных стратегий кеширования. Различные реализации могут быть заменены без каких-либо изменений в коде, который их использует.
  • Чтобы разрешить функции или методу принимать и оперировать параметром, который соответствует интерфейсу, не заботясь о том, что ещё может делать объект или как он реализован. Эти интерфейсы часто называют Iterable , Cacheable , Renderable и так далее, чтобы описать их поведение.

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

Замечание:

Хотя они поддерживаются, использование конструкторов в интерфейсах настоятельно не рекомендуется. Это значительно снижает гибкость объекта, реализующего интерфейс. Кроме того, к конструкторам не применяются правила наследования, что может привести к противоречивому и неожиданному поведению.

implements

Для реализации интерфейса используется оператор implements . Класс должен реализовать все методы, описанные в интерфейсе, иначе произойдёт фатальная ошибка. При желании классы могут реализовывать более одного интерфейса, разделяя каждый интерфейс запятой.

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

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

Замечание:

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

Замечание:

Класс, реализующий интерфейс, должен объявить все методы в интерфейсе с совместимой сигнатурой.

Константы ( Constants )

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

Примеры

Пример #1 Пример интерфейса

// Объявим интерфейс ‘Template’
interface Template
public function setVariable ( $name , $var );
public function getHtml ( $template );
>

// Реализация интерфейса
// Это будет работать
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 );
>

// Это не будет работать
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (Template::getHtml)
// (Фатальная ошибка: Класс BadTemplate содержит 1 абстрактный метод
// и поэтому должен быть объявлен абстрактным (Template::getHtml))
class BadTemplate implements Template
private $vars = [];

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

Пример #2 Наследование интерфейсов

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

// Это сработает
class C implements B
public function foo ()
>

public function baz ( Baz $baz )
>
>

// Это не сработает и выдаст фатальную ошибку
class D implements B
public function foo ()
>

Пример #3 Множественное наследование интерфейсов

interface B
public function bar ();
>

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

class D implements C
public function foo ()
>

Пример #4 Интерфейсы с константами

interface A
const B = ‘Константа интерфейса’ ;
>

// Выведет: Константа интерфейса
echo A :: B ;

class B implements A
const B = ‘Константа класса’ ;
>

// Выведет: Константа класса
// До PHP 8.1.0 этот код не будет работать,
// потому что было нельзя переопределять константы.
echo B :: B ;
?>

Пример #5 Интерфейсы с абстрактными классами

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

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

// Абстрактный класс может реализовывать только часть интерфейса.
// Классы, расширяющие абстрактный класс, должны реализовать все остальные.
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 ;
>
>
?>

Пример #6 Одновременное расширение и внедрение

// Порядок ключевых слов здесь важен. «extends» должно быть первым.
class Two extends One implements Usable , Updatable
/* . */
>
?>

Интерфейс, совместно с объявлениями типов, предоставляет отличный способ проверки того, что определённый объект содержит определённый набор методов. Смотрите также оператор instanceof и объявление типов.

Источник

Интерфейсы объектов

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

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

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

implements

Для реализации интерфейса используется оператор implements. Класс должен реализовать все методы, описанные в интерфейсе; иначе произойдет фатальная ошибка. При желании классы могут реализовывать более одного интерфейса за раз, реализуемые интерфейсы должны разделяться запятой.

Замечание:

Класс не может реализовать два интерфейса, содержащих одноименную функцию, так как это повлечет за собой неоднозначность.

Замечание:

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

Замечание:

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

Константы (Constants)

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

Примеры

Пример #1 Пример интерфейса

// Объявим интерфейс ‘iTemplate’
interface iTemplate
public function setVariable ( $name , $var );
public function getHtml ( $template );
>

// Реализуем интерфейс
// Это сработает нормально
class Template implements iTemplate
private $vars = array();

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

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

// Это не будет работать
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
// (Фатальная ошибка: Класс BadTemplate содержит 1 абстрактный метод
// и поэтому должнен быть объявлен абстрактным (iTemplate::getHtml))
class BadTemplate implements iTemplate
private $vars = array();

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

Пример #2 Расширяемые интерфейсы

interface b extends a
public function baz ( Baz $baz );
>

// Это сработает
class c implements b
public function foo ()
>

public function baz ( Baz $baz )
>
>

// Это не сработает и выдаст фатальную ошибку
class d implements b
public function foo ()
>

Пример #3 Множественное наследование интерфейсов

interface b
public function bar ();
>

interface c extends a , b
public function baz ();
>

class d implements c
public function foo ()
>

Пример #4 Интерфейсы с константами

interface a
const b = ‘Константа интерфейса’ ;
>

// Выведет: Константа интерфейса
echo a :: b ;

// Вот это, однако, не будет работать, так как
// константы перекрывать нельзя.
class b implements a
const b = ‘Class constant’ ;
>
?>

Интерфейс, совместно с контролем типов, предоставляет отличный способ проверки того, что определенный объект содержит определенный набор методов. Смотрите также оператор instanceof и контроль типов.

Источник

Const in interface php

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

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

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

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

implements

Для реализации интерфейса используется оператор implements . Класс должен реализовать все методы, описанные в интерфейсе, иначе произойдет фатальная ошибка. При желании классы могут реализовывать более одного интерфейса, разделяя каждый интерфейс запятой.

Замечание:

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

Замечание:

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

Замечание:

Объявления методов в классе, реализующем интерфейс, должны быть совместимы с принципом подстановки Барбары Лисков (Liskov Substitution Principle, LSP), в противном случае будет вызвана фатальная ошибка.

Константы ( Constants )

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

Примеры

Пример #1 Пример интерфейса

// Объявим интерфейс ‘iTemplate’
interface iTemplate
public function setVariable ( $name , $var );
public function getHtml ( $template );
>

// Реализация интерфейса
// Это будет работать
class Template implements iTemplate
private $vars = array();

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

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

// Это не будет работать
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
// (Фатальная ошибка: Класс BadTemplate содержит 1 абстрактный метод
// и поэтому должен быть объявлен абстрактным (iTemplate::getHtml))
class BadTemplate implements iTemplate
private $vars = array();

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

Пример #2 Наследование интерфейсов

interface b extends a
public function baz ( Baz $baz );
>

// Это сработает
class c implements b
public function foo ()
>

public function baz ( Baz $baz )
>
>

// Это не сработает и выдаст фатальную ошибку
class d implements b
public function foo ()
>

Пример #3 Множественное наследование интерфейсов

interface b
public function bar ();
>

interface c extends a , b
public function baz ();
>

class d implements c
public function foo ()
>

Пример #4 Интерфейсы с константами

interface a
const b = ‘Константа интерфейса’ ;
>

// Выведет: Константа интерфейса
echo a :: b ;

// Это, однако, не будет работать, так как
// константы переопределять нельзя.
class b implements a
const b = ‘Константа класса’ ;
>
?>

Интерфейс, совместно с контролем типов, предоставляет отличный способ проверки того, что определенный объект содержит определенный набор методов. Смотрите также оператор instanceof и объявление типов.

Источник

Читайте также:  Java class implements interface example
Оцените статью