Powered by CodeIgniter

Уроки

(28)
14
16 голосов
Учиться, учиться и еще раз учиться — развитие личности идет таким путем.
Позвольте рассказать вам о важнейшем нововведении cogear² — переход на PHP SPL. Что это такое? Standart PHP Library — стандартная библиотека PHP, появившаяся в пятой версии языка. Много кто о ней знает, но далеко не все ее используют. Умников, читающих по-английски, сразу отправлю на интересный сайт, а сам тем временем расскажу своими словами.
Итак, что же такого придумали создатели языка, чтобы упростить рутинные задачи и повысить производительность и эффективность?
Чтобы не вдаваться в писанину, постараюсь объяснить все на пальцах. Есть массив с данными. А есть точной такой же объект с данными. Преимущества объекта в том, что над ним можно производить манипуляции через методы, наследоваться от него и делать производные классы. Кроме того, объект еще более эффективно расходует память.
Причем, поскольку объект перенимает интерфейс Traversable, мы можем по нему бегать при помощи циклов foreach, while, for, и совсем не почувствует разницы визуально.
Объект этот называется ArrayObject.
Он де факто присутствует в вашем PHP, его не надо подключать, как, впрочем, и все остальные пряники из SPL.
Мы наследуем и расширяем его в нашем любимом Core_ArrayObject.
Дополнительного шарма придает тот факт, что превратив массив в наш объект, мы можем обращаться к нему как к массиву, так и как к объекту.
$data = array('one'=>1,'two'=>2,'three'=>3); $object = new Core_ArrayObject($data); // Выведет две единицы echo $object->one; echo $object['one']; Правда здорово? Да.

Если же у нас многоуровневый массив, то его надо трансформировать (иначе только первый уровень становится объектом).
$object = Core_ArrayObject::transform($data);
Дальше — еще интересней. Нам больше не надо проверять на isset или empty, потому что волшебным методом мы обращаемся к хранилищу внтури объекта.
/** * Magic __get method * * @param string * @return mixed */ public function __get($name) { if (!$this->offsetExists($name)) { return NULL; } return $this->offsetGet($name); } /** * Magic __set method * * @param string * @param mixed */ public function __set($name, $value) { $this->offsetSet($name, Core_ArrayObject::transform($value)); }
Пример:
//Раньше if(isset($object->var)){ … } // Теперь if($object->var){ … } // Если var не существует мы просто получим NULL, а не ошибку
Для желающих практиковаться с isset — функция, конечно же, работает и с нашим объектом. Просто так удобнее, меньше кода.

Мы можем делать удивительные вещи, манипулировать нашим ООП-массивом.
// Перевернуть $object->reverse(); // Смешать с другим массивом $object->mix(array('four'=>4)); // Добавить значение в начало $object->prepend('some_val'); // Добавить значение в конец $object->append('some_other_val'); // Отсеять пересекающиеся данные $object->differ(array('two'=>2)); // Вставить в нужное место значение $object->inject('some_val','two',Core_ArrayObject::AFTER); Удобно, даже очень. А теперь подумайте, что почти все в новом cogear² наследуется или дружит с этим классом — меню, списки, данные и т.д. То есть мы можем добавлять новые элементы меню, вставляя нужные нам значения по-середине, к примеру. Вариантов неограниченное множество.

Есть еще такая вещь важная, называется итераторы. Когда вы обходите наш объект циклом, используется итератор по-умолчанию. Но вы можете использовать и свой итератор.

Хороший пример фильтрующего итератора:
<?php class UserFilter extends FilterIterator { private $userFilter; public function __construct(Iterator $iterator , $filter ) { parent::__construct($iterator); $this->userFilter = $filter; } public function accept() { $user = $this->getInnerIterator()->current(); if( strcasecmp($user['name'],$this->userFilter) == 0) { return false; } return true; } } $array = array( array('name' => 'Jonathan','id' => '5'), array('name' => 'Abdul' ,'id' => '22') ); $object = new ArrayObject($array); // Note it is case insensitive check in our example due the usage of strcasecmp function $iterator = new UserFilter($object->getIterator(),'abdul'); foreach ($iterator as $result) { echo $result['name']; } /* Outputs Jonathan */
Пространства для фантазии — масса.

Настоятельно рекомендую всем ознакомиться с доками по SPL: www.php.net/manual/en/book.spl.php.
10:39 ← 26 июля 2011 Отправить в Твиттер adminadmin  RSS comments 7

Комментарии (7) ↓

Isildien Isildien time 10:54 ← 26 июля 2011 #
Интересно
Freem Freem time 12:14 ← 26 июля 2011 #
Круто! С cogear я узнал о крутости glob, а теперь и ArrayObject. Продолжай в том же духе.
Graid Graid time 14:07 ← 26 июля 2011 #
я вот сегодня докопался еще до одной полезной функции var_export.
JiLiZART JiLiZART time 14:18 ← 26 июля 2011 #
Хе хе :)
inetlover inetlover time 00:25 ← 28 июля 2011 #
Спасибо, интересная тема!
Nailed Nailed time 09:38 ← 28 сентября 2011 #
Помню как у меня известие об этом вызвало восторг. Но, больший восторг у меня вызвал stdClass.