MyTetra Share
Делитесь знаниями!
Создание и использование интерфейсов в PHP
Время создания: 04.04.2013 19:39
Раздел: Компьютер - Программирование - Язык PHP
Запись: xintrea/mytetra_syncro/master/base/13650899899els6xtisj/text.html на raw.github.com

Создание и использование интерфейсов

Интерфейсы во многом схожи с абстрактными классами. Интерфейс - это шаблон, который задает поведение одного или более классов.

Вот основные отличия между интерфейсами и абстрактными классами:

  • Ни один метод не может быть описан в интерфейсе. Они все абстрактны. В абстрактном классе могут быть и не абстрактные методы.
  • Интерфейс не может содержать полей - только методы.
  • Класс имплементирует интерфейс, и класс наследует или расширяет другой класс.
  • Класс может имплементировать несколько интерфейсов одновременно. Этот же класс может наследовать другой класс. Но у дочернего класса может быть только один супер-класс (абстрактный или нет).

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

interface MyInterface {

public function aMethod();

public function anotherMethod();

}

Чтобы создать класс, который имплементирует тот или иной интерфейс, напишите так:

class MyClass implements MyInterface {

public function aMethod() {

// (имплементация метода)

}

public function anotherMethod() {

// (имплементация метода)

}

}

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

Например, веб-форум может содержать класс Member для участников форума и класс Topic для тем, создаваемых участниками форума. В отношении наследования, эти классы скорее всего не будут зависеть друг от друга, так как они выполняют совершенно разные функции.

Тем не менее, давайте предположим, что нам нужно будет доставать их и записывать в базу данных как объекты класса Member, так и объекты Topic. Для этого мы создадим интерфейс Persistable, в котором будут методы для сохранения объектов в БД и извлечения их оттуда:

interface Persistable {

public function save();

public function load();

public function delete();

}

Теперь давайте создадим класс Member и имплементируем для него интерфейс Persistable. Это значит, что в интерфейсе должны быть методы save(), load() и delete():

class Member implements Persistable {

private $username;

private $location;

private $homepage;

public function __construct( $username, $location, $homepage ) {

$this->username = $username;

$this->location = $location;

$this->homepage = $homepage;

}

public function getUsername() {

return $this->username;

}

public function getLocation() {

return $this->location;

}

public function getHomepage() {

return $this->homepage;

}

public function save() {

echo "Saving member to database<br>";

}

public function load() {

echo "Loading member from database<br>";

}

public function delete () {

echo "Deleting member from database<br>";

}

}


Наш класс Topic также будет имплементировать данный интерфейс, поэтому в нем тоже должны быть эти три метода:

class Topic implements Persistable {

private $subject;

private $author;

private $createdTime;

public function __construct( $subject, $author ) {

$this->subject = $subject;

$this->author = $author;

$this->createdTime = time();

}

public function showHeader() {

$createdTimeString = date( 'l jS M Y h:i:s A', $this->createdTime );

$authorName = $this->author->getUsername();

echo "$this->subject (created on $createdTimeString by $authorName)<br>";

}

public function save() {

echo "Saving topic to database<br>";

}

public function load() {

echo "Loading topic from database<br>";

}

public function delete () {

echo "Deleting topic from database<br>";

}

}


На заметку: так как у нас форум - воображаемый, вместо взаимодействия с базой данных в методах save(), load() и delete() просто выводятся сообщения.

Мы также добавили несколько дополнительных методов, например, Member::getUsername() для получения имени пользователя, и Topic::showHeader() для отображения названия темы, имени автора и времени создания темы.

Теперь можем создать объекты классов Member и Topic, а затем вызвать их методы getUsername() и showHeader(). Более того, зная, что эти классы имплементируют интерфейс Persistable, мы можем вызывать такие методы, как save(), load() или delete():

$aMember = new Member( "fred", "Chicago", "http://example.com/" );

echo $aMember->getUsername() . " lives in " . $aMember->getLocation() ."<br>";

$aMember->save();

$aTopic = new Topic( "Teddy Bears are Great", $aMember );

$aTopic->showHeader();

$aTopic->save();

На странице отобразится:

fred lives in Chicago

Saving member to database

Teddy Bears are Great (created on Wednesday 25th May 2011 02:19:14 AM by fred)

Saving topic to database

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

class MyClass implements anInterface, anotherInterface {

...

}

На заметку: интерфейсы - это мощное свойство ООП, и о них можно еще много чего сказать. Узнать о них больше можно в PHP документации.

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования