Извращения кодера, блог php программиста Нетривиальный кодинг

1Фев/106

Пример использования ArrayAccess

Мне недавно в блоге задали вопрос о применении ArrayAccess. Просто как замену массивам - глупо, тем более теряется производительность. Итак, для этого у нас две основные причины - set/get должны как-то влиять на значение переменных, вторая - объект может использовать данные помещённые в нём для других методов.

Рассмотрим примеры. У нас есть класс для работы с таблице из базы данных как с объектом.

11Янв/100

Смешиваем singleton и registry

Основное достоинство Одиночки одновременно является и его недостатком. Допустим у нас есть класс для работы с базой данных реализованный на singleton (о ужОс, нужно было хотя бы фабрику). Всё замечательно работает, пока в один непогожий день мы не придумываем держать данные в разных базах на разных серверах. Ну и этого геморроя нам мало, поэтому от возможностей мускула мы отказываемся. И приплыли... Соединение у нас то ОДНО. Отказываться от singleton и перелопачивать тонны кода тоже не с руки, значим поставим костыль.

30Дек/090

Паттерн: Singleton

Продолжая тему паттернов бегло расскажу что это за зверь singleton. На русский язык он переводится как "одиночка", относится к порождающим паттернам и позволяет нам плодить объекты, вернее всего один. Singleton гарантирует, что будет создан только один экземпляр класса. Для этого конструктор делается приватным и создаётся статический метод, который проверяет создан ли уже объект и возвращает нам этот объект.

11Май/090

Конференция “Байнет 2.3 Gamma: в новом формате веба”

14-15-16 мая 2009.

Конференция “Байнет 2.3 Gamma: в новом формате веба” – одно из крупнейших событий Беларуси в области современных информационных технологий. В 2009 году пройдет в третий раз.

14 мая будет посвящено техническим вопросам современного интернета: программирование, верстка, веб-стандарты, проектирование интерфейсов, хостинг и т.п.

15 мая будет посвящено гуманитарным вопросам: блоггинг, интернет маркетинг и пиар, аналитика рынков, дизайн, презентация новых проектов, инвестиции и т.п.

16 мая станет специализированным днем по видео в интернете: интернет-трансляции, потоковое видео и сервисы для него, интернет-телевидение, съемка, монтаж и кодирование видео и т.п.

Участие в конференции БЕСПЛАТНОЕ.

Программа события здесь

Я буду учавствовать в конференции с докладом "Удобная работа с базами данных в PHP", который посвящён ORM, теория, реализация и более-менее подробно задержусь на Doctrine.

4Апр/090

Компания microsoft открыла код MVC фреймворка для ASP.NET

К этому они шли очень долго, но никто не ждал такого финиша. Первые креативные мысли по созданию своей реализации MVC появились у разработчиков ещё в 2007 году, затем вышло несколько версий - превью, беты, релиз кандидаты. Но лишь в марте 2009 года состоялся настоящий релиз.

Если релиза ждали многие, то вот о том что это будет ещё не самая важная новость, догадывалось нороду мало. Недавно было объявлено, что фреймворк является открытым и распостраняется под открытой лицензией MS-PL.

Меня не прильщает ASP.NET, но посмотреть в исходники от корпорации тьмы я всё же решил, чего и другим советую. Качать здесь.

Ну и немного оффтопа. Microsoft превратилась в красную тряпку для многих айтишников, а быки как известно - дальтоники, им плевать на что бросаться. Не уподобляйтесь им, не всё творимое "чёрной" компанией является плохим. И от просмотра кода или знакомства с их продуктами Вы не превратитесь мгновенно в зомби.

2Апр/094

Паттерн: Registry

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

2Дек/089

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 не стоит на месте, потому, кое-что уже изменилось, постоянно добавляются новые классы, методы и интерфейсы, чтобы не изобретать свои велосипеды.

Метки записи: , , , 9 Комментарии
27Ноя/080

Flash сообщения 2

Как и обещал, вернулся к flash сообщениям. Переделаем его на статические методы. Итак, немножко теории.
Статические методы могут вызываться без создания экземпляра класса (объекта), при объявлении метода указывается ключевое слово static. Точно так же объявляется и статический атрибут класса.

15Ноя/086

Свой шаблонизатор 2

В первой части мы по всем правилам ООП создали шаблонизатор, теперь наростим его мощь, будем делать это двумя способами:

  1. Расширая класс Amdy_Templater
  2. С помощью классов-помощников.
12Ноя/088

Свой шаблонизатор

Вы хотите отделить логику представления от остальных слоёв приложения? Вам нужен шаблонизатор, желательно простенкий. Ну чтоже, напишем свой.

Обределимся с минимумом:

  1. Передать переменную в шаблонизатор
  2. Взять переменную из шаблонизатора
  3. Отобразить шаблон