Позвольте рассказать вам о важнейшем нововведении 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.
Комментарии (7) ↓
Интересно
Круто! С cogear я узнал о крутости glob, а теперь и ArrayObject. Продолжай в том же духе.
я вот сегодня докопался еще до одной полезной функции var_export.
Хе хе :)
Спасибо, интересная тема!
Помню как у меня известие об этом вызвало восторг. Но, больший восторг у меня вызвал stdClass.

