ФорумПрограммированиеPHP для идиотовPHP и ООП → Изменить ArrayObject

Изменить ArrayObject

  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 31 марта 2009 г. 10:03

    При вызове неопределенного ключа массива, созданного с помощью ArrayObject, возникает нотис, так как такого ключа нет. Нужно, чтобы в случае ошибки возвращался null, а не выводился нотис. Поэтому нужно перегрузить метод offsetGet класса ArrayObject. Пытался по разному. Вот что на данный момент:

    class MyArrayObject extends ArrayObject
    {
       public function offsetGet($key)
       {
           if ($this->offsetExists($key))
           {
               return parent::offsetGet($key);
           }
           
           return null;
       }
    }

    Но такой способ работает только если массив одномерный. Чувствую, что тут придется перегружать не только offsetGet =/
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 31 марта 2009 г. 10:44, спустя 40 минут 24 секунды

    Вроде сделал :)
    class MyArrayObject extends ArrayObject
    {
    protected $array = array();

    public function __construct($array = array())
    {
    foreach ((array) $array as $key => $value)
    {
    if (is_array($value))
    {
    $this->array[$key] = new self($value);
    }
    else
    {
    $this->array[$key] = $value;
    }
    }
    }

    public function offsetGet($key)
    {
    if (array_key_exists($key, $this->array))
    {
    return $this->array[$key];
    }
    }

    public function offsetSet($key, $value)
    {
    if ($key)
    {
    $this->array[$key] = $value;
    }
    else
    {
    $this->array[] = $value;
    }
    }

    public function offsetUnset($key)
    {
    if (array_key_exists($key, $this->array))
    {
    unset($this->array[$key]);
    }
    }

    public function offsetExists($key)
    {
    return array_key_exists($key, $this->array);
    }

    public function append($value)
    {
    $this->array[] = $value;
    }

    public function count()
    {
    return count($this->array);
    }
    }
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 31 марта 2009 г. 10:59, спустя 15 минут 32 секунды

    Но как прикрутить итератор к этому классу? Чтобы можно было в foreach проходится по массиву.
    Бля, придется походу еще и MyIterator писать :D А хотя нет xDDD Нужно было сделать метод:

       public function getIterator()
       {
           return new ArrayIterator($this->array);
       }

    Плюс добавить __toString для красоты :P

    public function __toString()
    {
    return 'Array';
    }
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 31 марта 2009 г. 11:52, спустя 52 минуты 51 секунду

    "Обкуренный блог" :)
    adw/0
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 31 марта 2009 г. 11:53, спустя 1 минуту 25 секунд

    ыыы, наверно никто не отвечал, потому что знали, что я сам отвечу на свой вопрос xD
  • phpdude

    Сообщения: 26618 Репутация: N Группа: в ухо

    Spritz 31 марта 2009 г. 13:32, спустя 1 час 39 минут 1 секунду

    пиздец.

    echo @$array['key'] :D будь проще.
    Сапожник без сапог
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 31 марта 2009 г. 13:33, спустя 50 секунд

    вот он.. встречайте!
  • phpdude

    Сообщения: 26618 Репутация: N Группа: в ухо

    Spritz 31 марта 2009 г. 13:34, спустя 47 секунд

    можете не кланятсо, я же не поздоровался с вами :)
    Сапожник без сапог
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 1 апреля 2009 г. 3:37, спустя 14 часов 2 минуты 51 секунду

    долго улыбался с конструктора

    public function __construct($array = array())
    {
    foreach ((array) $array as $key => $value)
    {
    if (is_array($value))
    {
    $this->array[$key] = new self($value);
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 1 апреля 2009 г. 6:26, спустя 2 часа 48 минут 58 секунд

    а че там не так??)
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 1 апреля 2009 г. 10:14, спустя 3 часа 48 минут 25 секунд

    это какойто анипатерн…
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 1 апреля 2009 г. 10:16, спустя 1 минуту 35 секунд

    ну а как еще сделать? и где тут "плохое место"? как это место можно изменить?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 1 апреля 2009 г. 16:53, спустя 6 часов 37 минут 9 секунд

    плохое место в конструкторе new self
    перенести
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 2 апреля 2009 г. 8:30, спустя 15 часов 37 минут 5 секунд

    а почему это плохо?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 2 апреля 2009 г. 9:17, спустя 46 минут 43 секунды

    голова, стена, бежать… (с)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!