Абстрактные классы - для чего?

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

Предположим что на сайте есть форма, в которую пользователь должен ввести свои логин и пароль. Далее при нажатие на кнопку submit введенные им данные попадают в наш класс, скажем, class UserLogin { }. Казалось бы, чего сложного, проверить в базе и дальше авторизировать или нет. Для штучных, единичных и маленьких проектах, которые никогда и не будут развиватся, подобный подход самый быстрый и удобный, но когда надо написать нечно большое и развивающееся, здесь не обойтись без ООП.

Пароли могут хранится не только в базе SQL на хосте, но и скажем в базе другого хоста или в LDAP. Способов может быть множество и модули, под каждый из этих способов, не обязательно должен быть написан вами и не обязательно во время создание сайта. Это могут делать совершенно другие люди.

Вернемся к нашему классу и предположим что другая группа программистов пишет класс который будет проверять данные пользователя в своей базе. Вы конечно можете потратить время на то что бы договорится с ними что вам нужно получить от них, но можно сократит его, начав говорить на универсальном языке, язык кода, а именно абстрактный класс. И вот он
abstract class loginModule{

public $info=false;

abstract protected function ifMember($login, $pass);

final function getInfo(){
return $this->info;
}

}

Абстрактный класс указывает своему наследнику какие методы там должны быть, вернее обязаны быть. Например метод ifMember который получит пароль и логин, и метод getInfo() который должен вернуть данные пользователя которого нашли или false.

Теперь, ваши партнеры могут написать нечто похожее на вот это.
class checkldap extends loginmodule{
function ifMember($login, $pass){
// некий код проверки
$this->info=true;
}
}

И таких модулей может быть много главное чтоб они был extends loginmodule. После этого в нашем классе мы делаем следующее
class UserLogin{
$checkldap=new checkldap();
$checkldap->ifMember("login","pass");
If ($checkldap->getInfo()){
// похоже это их пользователь
}else{
// а возможно нет так что проверим у других
}
}

Вот так с помощью абстрактного класс можно заложить основу расширяемости проекта.

И напоследок:

» Абстрактные классы также могут содержать обычные (не абстрактные) элементы.
» Нельзя объявлять абстрактными свойства класса.
» Нельзя напрямую создавать экземпляр абстрактного класса.

Оставить комментарий

You must be авторизироватся для добавления комментария.