<?php
/**
* Пример реализации Generic-класса
*
* Возможности:
* 1. Осуществляет доступ к параметрам класса через методы get* set* (accessors/mutators)
* Пример: $object->setName('Dima'); $object->getName();
* При изменении стандартного поведения метода (добавление дополнительной логики)
* можно просто определить его в классе при этом не изменяя интерфейс класса.
* 2. Поддерживает встроенную валидацию данных с возможностью использовать или заранее
* определенные типы данных (numeric, string, email, date и др.)
* или регулярные выражения.
* 3. Имплементирует паттерн Lazy initialization для инициализации объектов.
* Позволяет загружать параметры объекта из БД (например) не сразу при инициализации,
* а только при первом запросе.
*
* Видимые недостатки:
* 1. Отсутствует возможность использовать автокомплит в IDE, так как методы явно не определены
*
* Плюсы:
* 1. Позволяет избежать дублирования кода при определении однотипных методов set и get
* 2. Сокращает код классов и централизует управление параметрами
* 3. При необходимости можно расширить функциональность. Например, добавив callback функции
* или принудительную фильтрацию данных.
* 4. Избавляет от рутинных обязанностей проверки входящих данных, тем самым
* обеспечивая некоторый уровень безопасности.
* Это совсем не дает 100% гарантии — не стоит забывать об этом.
* 5. Не вносит коррективы в интерфейс классов. Можно легко сочетать обычные классы и классы
* наследующие GenericObject без видимых различий для клиентов класса. При необходимости
* можно легко отказаться от использования просто переопределив все гетеры и сетеры.
* 6. Упрощает работу с классами, предоставляя удобный и естественный способ
* инициализации объектов:
* $obj1 = new Class(123);
* $obj2 = new Class(array(
* 'param1' => 'value1',
* 'param2' => 'value2')
* ));
*/
/**
* Пример реализации Generic-класса
*
* Возможности:
* 1. Осуществляет доступ к параметрам класса через методы get* set* (accessors/mutators)
* Пример: $object->setName('Dima'); $object->getName();
* При изменении стандартного поведения метода (добавление дополнительной логики)
* можно просто определить его в классе при этом не изменяя интерфейс класса.
* 2. Поддерживает встроенную валидацию данных с возможностью использовать или заранее
* определенные типы данных (numeric, string, email, date и др.)
* или регулярные выражения.
* 3. Имплементирует паттерн Lazy initialization для инициализации объектов.
* Позволяет загружать параметры объекта из БД (например) не сразу при инициализации,
* а только при первом запросе.
*
* Видимые недостатки:
* 1. Отсутствует возможность использовать автокомплит в IDE, так как методы явно не определены
*
* Плюсы:
* 1. Позволяет избежать дублирования кода при определении однотипных методов set и get
* 2. Сокращает код классов и централизует управление параметрами
* 3. При необходимости можно расширить функциональность. Например, добавив callback функции
* или принудительную фильтрацию данных.
* 4. Избавляет от рутинных обязанностей проверки входящих данных, тем самым
* обеспечивая некоторый уровень безопасности.
* Это совсем не дает 100% гарантии — не стоит забывать об этом.
* 5. Не вносит коррективы в интерфейс классов. Можно легко сочетать обычные классы и классы
* наследующие GenericObject без видимых различий для клиентов класса. При необходимости
* можно легко отказаться от использования просто переопределив все гетеры и сетеры.
* 6. Упрощает работу с классами, предоставляя удобный и естественный способ
* инициализации объектов:
* $obj1 = new Class(123);
* $obj2 = new Class(array(
* 'param1' => 'value1',
* 'param2' => 'value2')
* ));
*/