Задача: «Для каждого класса требуется установить свой тип(группу), при этом они должны иметь общие методы, например инициализация.»
Решение:
создаем абстрактный класс
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# abstract class DomainObject { private $group; public function __construct() { $this->group = static::getGroup(); } public static function create() { return new static(); } static function getGroup() { return "default"; } } |
static — указывает на контекст класса который инициализировал вызов абстрактного класса. А так же вызывает статические методы класса. Static похож по своей работе на parent и self.
Дополнительно по static:
- http://www.php.net/manual/ru/language.oop5.late-static-bindings.php
- http://www.php.net/manual/ru/language.oop5.static.php
Реализуем несколько классов, которые будут наследовать DomainObject
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# class User extends DomainObject { } class Document extends DomainObject { static function getGroup() { return "document"; } } class SpreadSheet extends Document { } |
Создадим экземпляры наших классов и посмотрим что получилось в итоге
1 2 3 4 |
# print_r(User::create()); print_r(Document::create()); print_r(SpreadSheet::create()); |
1 2 3 4 5 |
# // результат User Object ( [group:DomainObject:private] => default ) Document Object ( [group:DomainObject:private] => document ) SpreadSheet Object ( [group:DomainObject:private] => document ) |
Будь первым кто прокомментирует статью.