Давеча столкнулся с неожиданной ошибкой: PHP: <?php class obj implements arrayaccess { private $container = array(); public function offsetSet($offset, $value) { $this->container[$offset] = $value; } public function offsetExists($offset) { return isset($this->container[$offset]); } public function offsetUnset($offset) { unset($this->container[$offset]); } public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } $array = new obj; $array['a'] = array(); $array['a']['b'] = 1; Так что же это получается - чтобы работать с вложеными массивами, надо их копировать? PHP: <?php $a = $array['a']; $a['b'] = 1; $array['a'] = $a;
Они тоже должны быть объектами твоего типа. PHP: <?php $array = new obj; $array['a'] = new obj; $array['a']['b'] = 1;
Точно! Настрочил такой класс: PHP: <?php class orray implements arrayaccess { private $container = array(); public function offsetSet($offset, $value) { if (is_array($value)) { $val = new self(); foreach ($value as $k => $v) { $val[$k] = $v; } $value = $val; } $this->container[$offset] = $value; } public function offsetExists($offset) { return isset($this->container[$offset]); } public function offsetUnset($offset) { unset($this->container[$offset]); } public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } $array = new orray; $array['a'] = array(array(array())); $array['a'][0][0]['name'] = 'vasya'; echo $array['a'][0][0]['name']; Работает
[vs] Те же самые замечания что касаются ArrayObject касаются и твоего класса. Производительность съедается перегрузкой.
Тут BM приведен: http://ru.php.net/ArrayObject Код (Text): ArrayObject fill 0.01441502571106 ArrayObject read_key 0.018320083618164 ArrayObject read_foreach 2.1559031009674 array() fill 0.012364864349365 array() read_key 0.013092041015625 array() read_foreach 0.011217832565308 Медленнее всего работает итерация foreach. Поэтому в 20 раз лучше получить сначала переменную с обычным массивом, потом делать foreach. Раз так, то этот функционал мне не нужен.
И ты туда же.... Блин вы меня убиваете своими спичечными оптимизациями... Инициализация 1000 000 (fill) Код (Text): Твой класс 7.8214108943939 ArrayObject 0.78190612792969 Array 0.66266989707947 for с переприсвоением 1000 000 (for write_key) Код (Text): Твой класс 1.0682549476624 ArrayObject 0.2873969078064 Array 0.21040177345276 for с чтением 1000 000 (for read_key) Код (Text): Твой класс 0.80967402458191 ArrayObject 0.2388379573822 Array 0.21538090705872 foreach с переприсвоением 1000 000 (foreach write_key) Код (Text): ArrayObject 0.31118583679199 Array 0.44690585136414 foreach с чтением 1000 000 (foreach read_key) Код (Text): ArrayObject 0.32870888710022 Array 0.25177001953125 Upd: Добавил for read_key, foreach read_key Еще вопросы?
Нифига, мой класс создается быстрее, чем arrayacces. А если, как ты предалагаешь, наследовать от него, то получается всё остальное еще медленнее. Правда, тут выяснилось, что работа с вложеными массивами реализована в arrayobject, поэтому наследовать ничего не надо. Буду использовать его.
Это еще откуда? Ты наверняка что-то другое хотел сказать. ArrayAccess - интерфейс. Он создаваться не может. И обращаю внимание "инициализация" у меня в сообщении - это не создание класса. Это заполнение первоначальными значениями в цикле.
Не может твой класс инстанцироваться быстрее чем ArrayObject... Вот тебе еще, кстати PHP: <?php $arrayObject = new ArrayObject(range(0,999999)); $array = range(0,999999); Код (Text): ArrayObject 0.32296681404114 array 0.38041400909424 Upd: я был несколько не прав. Твой класс действительно инстанцируется быстрее. for 1000 000 $a = new ТвойКласс(); $a = new ArrayObject(); $a = array(); Код (Text): Твой класс 0.59917187690735 ArrayObject 0.97328877449036 array 0.24841785430908
Simpliest У тебя php неправильный PHP: for ($i = 0; $i< 1000; $i++) { $array = new arrayobject(range(0,9999)); } Код (Text): 4.8389 PHP: for ($i = 0; $i< 1000; $i++) { $array = array(range(0,9999)); } Код (Text): 4.2088 А инстанцирование действительно проходит быстрее PHP: for ($i = 0; $i< 10000000; $i++) { $array = new orray; } Код (Text): 13.333 PHP: for ($i = 0; $i< 10000000; $i++) { $array = new arrayobject; } Код (Text): 22.417 Upd. долго писал сообщение
5.3 плюс присвоение в цикле это было $a[$key] = $val; а не $a = new ArrayObject(range(0,999999); Вобщем, я не вижу смысл отказываться от ArrayObject в пользу самописных классов