Пошаговое руководство по ArrayAccess с вопросами

У меня есть несколько вопросов о реализации реализации 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?

Спасибо...


person Tarik    schedule 10.06.2011    source источник


Ответы (1)


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

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

public function __construct( array $data ) {
    $this->container = $data;
}
person Peter Bailey    schedule 10.06.2011
comment
Чтобы уточнить, вы объявляете методы в интерфейсе public, потому что это то, что делает интерфейс: он определяет общедоступный программный интерфейс. Вы не можете определять непубличные методы в интерфейсах, потому что это не имеет смысла. - person netcoder; 10.06.2011
comment
@netcoder - действительно. Спасибо за дополнительную информацию/разъяснение. - person Peter Bailey; 11.06.2011