|
|||||||
Абстрактные методы в 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 |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|