Прохождение ArrayAccess с вопросами - PullRequest
0 голосов
/ 10 июня 2011

У меня есть несколько вопросов о реализации реализации ArrayAccess в PHP.

Вот пример кода:

class obj implements arrayaccess {
    private $container = array();
    public function __construct() {
        $this->container = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }
    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $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;
    }
}

Вопросы:

  1. Я не спрашиваю, почему мы должны реализовать ArrayAccess, поскольку я предполагаю, что это специальный интерфейс, который PHP Engine распознает и вызывает реализованные унаследованные функции автоматически?
  2. Почему мы объявляем реализованную функцию публичной? Поскольку я предполагаю, что это специальные функции, вызываемые автоматически. Разве они не должны быть приватными, поскольку при вызове со словом $obj["two"] функции не вызываются извне.
  3. Есть ли особая причина назначать заполненный массив в функции __constructor? Это функция конструктора, которую я знаю, но в данном случае какая помощь ей ​​нужна.
  4. Какая разница между ArrayAccess и ArrayObject? Я думаю, что класс, который я реализовал путем наследования ArrayAccess, не поддерживает итерации?
  5. Как мы могли бы реализовать индексирование объектов без реализации ArrayAccess?

Спасибо ...

1 Ответ

3 голосов
/ 10 июня 2011
  1. Правильно
  2. Поскольку интерфейс определяет их как публичные, поэтому вам также нужно
  3. Вам не нужно писать конструктор таким образом, еслиВы не хотите, чтобы *
  4. ArrayAccess - это интерфейс , ArrayObject - это класс (который сам реализует ArrayAccess)
  5. Нет другого способа, которымМне известно о

* Ваш конструктор может выглядеть так

public function __construct( array $data ) {
    $this->container = $data;
}
...