вопрос по разработке "логичного" API

Духовность™

Продвинутый новичок
вопрос по разработке "логичного" API

Делаю класс-обертку над массивом.

PHP:
$o = new Cover_Var();

// добавляем данные...
$o->append(array('key'=>'value'));
$o->append('PHP');
$o->prepend(array('Ivan'=>'programmer'));

print_r($o);
/*
Cover_Var Object
(
    [data:protected] => Array
        (
            [0] => Cover_Var Object
                (
                    [data:protected] => Array
                        (
                            [Ivan] => programmer
                        )
                )
            [1] => Cover_Var Object
                (
                    [data:protected] => Array
                        (
                            [key] => value
                        )
                )
            [2] => PHP
        )
*/

echo $o->item(2); // выводит PHP
В чем собственно вопрос. Метод item() в классе необходим, с его помощью можно получать значения по числовым индексам. Но в методе item есть один минус - это его явное написание в коде программы. Есть идея так же дополнить класс виртуальным методом __get(), что бы получать значения "быстро":

PHP:
echo $o->item(0)->Ivan; // programmer
вместо длинного

PHP:
echo $o->item(0)->item('Ivan'); // programmer
но я не уверен, стоит ли так делать. Я и так в 101 раз буду переписывать свои наработки, которые время от времени страдают из-за изменения API классов.
 

Ewg

Новичок
PHP:
echo $o['0']['Ivan'];
Через ArrayObject.
Не будет ли удобнее?
 

Духовность™

Продвинутый новичок
Я использовал ArrayAccess (ArrayObject имплементирует его интерфейс). Теперь не хочу.

Синтаксис языка должен быть прозрачным. Доступ к значению в стиле ArrayAccess - это первый шаг к очень большой путанице. Доступ к объекту должен быть как к объекту. К массиву - как к массиву. Такими ударными темпами, с использованием интерфейсов подобных типов, мы скоро будем менять сам язык. У меня, кстати, такая идея была и вот во что превратилось: http://phpclub.ru/talk/showthread.php?s=&threadid=115416

Вообще, ИМХО, ArrayObject и прочие интерфейсы - это типичная заплатка языка PHP. Язык нужно было изначально делать Объектно-ориентированным. А его сделали структурным и теперь изобретают (в т.ч. и я) тучу мутных интерфейсов/классов для обеспечения единого стиля в программировании.

-~{}~ 23.11.09 15:46:

Вот пример с ArrayObject.
PHP:
$o = new ArrayObject();
$o->append(array(12,13,14));
$o->offsetGet(0)->append(15); // йух! - так нельзя
а во так можно:
PHP:
$o = new ArrayObject();
$o->append(array(12,13,14));
$o[0][] = 15;
только лично я не думаю, что работа с объектом как с массивом - это хорошее решение.
 

ps2007

Новичок
$o->offsetGet(0)->append(15); // йух! - так нельзя
если нельзя, но очень хочется, то можно :)
Есть такая методика - Method Chaining

А какой вообще смысл писать обертку над массивом ?
 

Духовность™

Продвинутый новичок
А какой вообще смысл писать обертку над массивом ?
Ну не совсем над массивом.

Мне просто нужно хранилище под мою нынешнюю реализацию. Хранилище, которое можно организовать по своим правилам. например, возвращать null, когда запрашивается неизвестный элемент. Совместить в нем IteratorAggregate, Countable и т.д.

Так что с моим изначальным вопросом? Как посоветуете?
 

ps2007

Новичок
Проблема в том, что сама постановка задачи противоречива.
сначала
PHP:
$o->prepend(array('Ivan'=>'programmer'));
затем
PHP:
echo $o->item(0)->Ivan; // programmer
Если подразумевается вставка массива, то к нему логичнее обращаться как к массиву.
Тут уже программисту придется самому решать, что ему дороже:
1) Дополнительные фичи, которые он может "навесить" на массив, при этом в некоторой степени пострадает удобство использования.
2) Синтаксис и свойства массива. Нельзя переделать свойства массива, это очевидно.
 

Духовность™

Продвинутый новичок
все массивы транслируются в объекты. мы зашли в глубокий офф, то я думаю отказаться от виртуального метода в пользу item()
 
Сверху