Пример использования ArrayAccess
Мне недавно в блоге задали вопрос о применении ArrayAccess. Просто как замену массивам - глупо, тем более теряется производительность. Итак, для этого у нас две основные причины - set/get должны как-то влиять на значение переменных, вторая - объект может использовать данные помещённые в нём для других методов.
Рассмотрим примеры. У нас есть класс для работы с таблице из базы данных как с объектом.
Смешиваем singleton и registry
Основное достоинство Одиночки одновременно является и его недостатком. Допустим у нас есть класс для работы с базой данных реализованный на singleton (о ужОс, нужно было хотя бы фабрику). Всё замечательно работает, пока в один непогожий день мы не придумываем держать данные в разных базах на разных серверах. Ну и этого геморроя нам мало, поэтому от возможностей мускула мы отказываемся. И приплыли... Соединение у нас то ОДНО. Отказываться от singleton и перелопачивать тонны кода тоже не с руки, значим поставим костыль.
Паттерн: Singleton
Продолжая тему паттернов бегло расскажу что это за зверь singleton. На русский язык он переводится как "одиночка", относится к порождающим паттернам и позволяет нам плодить объекты, вернее всего один. Singleton гарантирует, что будет создан только один экземпляр класса. Для этого конструктор делается приватным и создаётся статический метод, который проверяет создан ли уже объект и возвращает нам этот объект.
Конференция “Байнет 2.3 Gamma: в новом формате веба”
14-15-16 мая 2009.
Конференция “Байнет 2.3 Gamma: в новом формате веба” – одно из крупнейших событий Беларуси в области современных информационных технологий. В 2009 году пройдет в третий раз.
14 мая будет посвящено техническим вопросам современного интернета: программирование, верстка, веб-стандарты, проектирование интерфейсов, хостинг и т.п.
15 мая будет посвящено гуманитарным вопросам: блоггинг, интернет маркетинг и пиар, аналитика рынков, дизайн, презентация новых проектов, инвестиции и т.п.
16 мая станет специализированным днем по видео в интернете: интернет-трансляции, потоковое видео и сервисы для него, интернет-телевидение, съемка, монтаж и кодирование видео и т.п.
Участие в конференции БЕСПЛАТНОЕ.
Программа события здесь
Я буду учавствовать в конференции с докладом "Удобная работа с базами данных в PHP", который посвящён ORM, теория, реализация и более-менее подробно задержусь на Doctrine.
Компания microsoft открыла код MVC фреймворка для ASP.NET
К этому они шли очень долго, но никто не ждал такого финиша. Первые креативные мысли по созданию своей реализации MVC появились у разработчиков ещё в 2007 году, затем вышло несколько версий - превью, беты, релиз кандидаты. Но лишь в марте 2009 года состоялся настоящий релиз.
Если релиза ждали многие, то вот о том что это будет ещё не самая важная новость, догадывалось нороду мало. Недавно было объявлено, что фреймворк является открытым и распостраняется под открытой лицензией MS-PL.
Меня не прильщает ASP.NET, но посмотреть в исходники от корпорации тьмы я всё же решил, чего и другим советую. Качать здесь.
Ну и немного оффтопа. Microsoft превратилась в красную тряпку для многих айтишников, а быки как известно - дальтоники, им плевать на что бросаться. Не уподобляйтесь им, не всё творимое "чёрной" компанией является плохим. И от просмотра кода или знакомства с их продуктами Вы не превратитесь мгновенно в зомби.
Паттерн: Registry
Постараюсь расказать о моей реализации паттерна Registry под php. Registry - это ООП замена глобальным переменным, предназначеная для хранения данных и передачи их между модулями системы. Соответственно, его наделяют стандартными свойствами - запись, чтение, удаление. Вот типовая реализация.
SPL в PHP: ArrayObject
Довольно неожиданно пришла идея довести начатый шаблонизатор до юзабельного вида, дописал хелперы, встроил кеширование, решил прицепить хелпер для формы. И здесь мне стало нехватать ООП стиля. Накидав кой-чего понял что вначале нужно написать цикл статей о SPL (Стандартной PHP библиотеке). Эта штука очень полезна при ООП стиле кодирования, а особо нормальных статей об SPL на русском я не обнаружил.
Начнёмс.
ArrayObject - предназначен для того, чтобы объект вёл себя как массив, даёт доступ к данным через квадратные скобки и позволяет делать foreach
ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Countable {
/* Methods */
ArrayObject::__construct ( mixed $input )
void ArrayObject::append ( mixed $newval )
int ArrayObject::count ( void )
ArrayIterator ArrayObject::getIterator ( void )
bool ArrayObject::offsetExists ( mixed $index )
mixed ArrayObject::offsetGet ( mixed $index )
void ArrayObject::offsetSet ( mixed $index , mixed $newval )
void ArrayObject::offsetUnset ( mixed $index )
}
Данный класс имплементирует интерфейсы IteratorAggregate , Traversable , ArrayAccess , Countable
IteratorAggregate , Traversable - отвечают за гуляние по объекту, соответственно нужно реализовать метод getIterator. Эти вещи будем разбирать в другой раз.
Countable - нужно реализовать интерфейс для получения размера count.
ArrayAccess - это квадратные скобочки - проверка существования offsetExists, получение значения - offsetGet, присвоение значения - offsetSet, уничтожение элемента - offsetUnset и добавление элемента - append.
Со скучной теорией покончено, сейчас практика
class Amdy_Array extends ArrayObject {
protected $array;
public function __construct($array) {
$this->array = $array;
}
public function append($value) {
$this->array[] = $value;
}
function offsetSet($key, $value) {
if ($key) {
$this->array[$key] = $value;
} else {
$this->array[] = $value;
}
}
function offsetGet($key) {
if ( array_key_exists($key, $this->array) ) {
return $this->array[$key];
}
}
function offsetUnset($key) {
if ( array_key_exists($key, $this->array) ) {
unset($this->array[$key]);
}
}
function offsetExists($offset) {
return array_key_exists($offset, $this->array);
}
public function dump() {
var_dump($this->array);
}
}
Так мы побыстрому создали свой обработчик, унаследовав класс из SPL. Что же там происходит.
В конструктор передаётся сам массив, его можно передать и позже, но не важно. Данный массив мы загоняем во внутреннюю переменную $this->array, дальше, мы описываем, как должны обрабатываться запросы к объекту как к массиву. Т.е. все запросы будут реально относиться в переменно $this->array. Можно и вовсе не заводить эту переменную, а работать с атрибутами класса, если в коде заменить $this->array, на get_class_vars($this), $this->{$k} и т.д.
Простой пример использования.
$array = new Amdy_Array(
array(
'test',
'test1' => array(0,1,2,3),
2,
'test4' => 'test2 value'
)
);
$array[] = 'test2222';
echo $array[0] . '<hr/>';
echo $array['test4'] . '<hr/>';
$array->dump();
PHP не стоит на месте, потому, кое-что уже изменилось, постоянно добавляются новые классы, методы и интерфейсы, чтобы не изобретать свои велосипеды.
Flash сообщения 2
Как и обещал, вернулся к flash сообщениям. Переделаем его на статические методы. Итак, немножко теории.
Статические методы могут вызываться без создания экземпляра класса (объекта), при объявлении метода указывается ключевое слово static. Точно так же объявляется и статический атрибут класса.
Свой шаблонизатор 2
В первой части мы по всем правилам ООП создали шаблонизатор, теперь наростим его мощь, будем делать это двумя способами:
- Расширая класс Amdy_Templater
- С помощью классов-помощников.
Свой шаблонизатор
Вы хотите отделить логику представления от остальных слоёв приложения? Вам нужен шаблонизатор, желательно простенкий. Ну чтоже, напишем свой.
Обределимся с минимумом:
- Передать переменную в шаблонизатор
- Взять переменную из шаблонизатора
- Отобразить шаблон