Задача: «Для каждого класса требуется установить свой тип(группу), при этом они должны иметь общие методы, например инициализация.»
Решение:
создаем абстрактный класс
# 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
# class User extends DomainObject { } class Document extends DomainObject { static function getGroup() { return "document"; } } class SpreadSheet extends Document { }
Создадим экземпляры наших классов и посмотрим что получилось в итоге
# print_r(User::create()); print_r(Document::create()); print_r(SpreadSheet::create());
# // результат User Object ( [group:DomainObject:private] => default ) Document Object ( [group:DomainObject:private] => document ) SpreadSheet Object ( [group:DomainObject:private] => document )
Будь первым кто прокомментирует статью.