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

Работа с абстрактными классами в PHP


Абстрактный класс - это такой класс, который не может быть реализован, то есть, вы не сможете создать объект класса, если он абстрактный. Вместо этого вы создаете дочерние классы от него и спокойно создаете объекты от этих дочерних классов. Абстрактные классы представляют собой шаблоны для создания классов.


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


На заметку: как только вы создали хотя бы один абстрактный метод в классе, вы должны объявить этот класс как абстрактный.


Когда от абстрактного класса наследуется обычный класс, он должен реализовать все абстрактные методы класса-родителя. В противном случае, PHP сгенерирует ошибку. Так, абстрактный класс создает “правила поведения” для своих дочерних классов.


На заметку: вы можете добавлять в абстрактный класс и не абстрактные методы. Они будут обыкновенным образом наследоваться дочерними классами.


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


abstract class Person {

private $firstName = "";

private $lastName = "";

public function setName( $firstName, $lastName ) {

$this->firstName = $firstName;

$this->lastName = $lastName;

}

public function getName() {

return "$this->firstName $this->lastName";

}

abstract public function showWelcomeMessage();

}


Как видите, мы создали абстрактный класс, добавив в его описание ключевое слово abstract. В этом классе есть несколько свойств, общих для всех людей, - $frstName и $lastName - а также методы для инициализации и чтения значений этих полей.


В классе также есть абстрактный метод showWelcomeMessage(). Этот метод выводит приветствие, когда пользователь входит на сайт. Опять же, мы добавляем ключевое слово abstract в описание данного метода, чтобы сделать его абстрактным. Так как он абстрактный, в нем нет ни строчки кода, это просто его объявление. Тем не менее, любой дочерний класс обязан добавить и описать метод showWelcomeMessage().


Теперь давайте создадим пару классов от абстрактного класса Person:

класс Member для участников форума;

класс Shopper для покупателей онлайн-магазина.


class Member extends Person {

public function showWelcomeMessage() {

echo "Hi " . $this->getName() . ", welcome to the forums!<br>";

}

public function newTopic( $subject ) {

echo "Creating new topic: $subject<br>";

}

}

class Shopper extends Person {

public function showWelcomeMessage() {

echo "Hi " . $this->getName() . ", welcome to our online store!<br>";

}

public function addToCart( $item ) {

echo "Adding $item to cart<br>";

}

}


Как видите, каждый из них описывает метод showWelcomeMessage() из абстрактного супер-класса. Они имплементированы по-разному: в классе Member отображается сообщение "welcome to the forums", а в классе Shopper - "welcome to our online store", но это нормально. Главное то, что они оба описали данный метод.


Если бы один из них, например, Shopper, не описал метод, PHP выдал бы ошибку:


Class Shopper contains 1 abstract method and must therefore be declared abstract

or implement the remaining methods (Person::showWelcomeMessage)


Наряду с имплементацией абстрактного метода, в каждом классе есть свои обычные методы. В Member есть метод newTopic() для создания новой темы в форуме, а в Shopper - метод addToCart() для добавления товаров в корзину.


Теперь мы можем создавать участников форума и покупателей на нашем сайте. Мы можем вызывать методы newTopic() и addToCart() от этих объектов, а также getName() и setName(), так как они наследуются от супер-класса Person.


Более того, зная, что классы Member и Shopper наследуются от Person, мы можем спокойно вызывать метод showWelcomeMessage() для обоих классов, так как он точно реализован и в том и в другом. Мы в этом уверены, так как знаем, что он был объявлен как абстрактный метод в классе Person.


Вот пример:


$aMember = new Member();

$aMember->setName( "John", "Smith" );

$aMember->showWelcomeMessage();

$aMember->newTopic( "Teddy bears are great" );

$aShopper = new Shopper();

$aShopper->setName( "Mary", "Jones" );

$aShopper->showWelcomeMessage();

$aShopper->addToCart( "Ornate Table Lamp" );


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


Hi John Smith, welcome to the forums!

Creating new topic: Teddy bears are great

Hi Mary Jones, welcome to our online store!

Adding Ornate Table Lamp to cart



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