2010-11-30 2 views
3

Реализация интерфейса ArrayAccess в PHP. Мы можем получить доступ к объектным свойствам в виде ключей массива. Каковы преимущества использования объекта как массива?Преимущества интерфейса ArrayAccess в PHP?

Как я вижу, рамочные, реализующие «формы» с ArrayAccess Interface, а затем мы можем получить доступ (HTML) Форма объектов Филдса нечто подобное,

$form['nameField'] instead-of $form->nameField 
$form['titleField'] instead-of $form->titleField 

Будет преимуществом использования $form['nameField] вместо-о $form->nameField

ли это скорость «Структур данных данных массива» или переносимость между формами объектов и массивов?

Или я что-то не хватает? :)

+0

Возможный дубликат: http://stackoverflow.com/questions/4072927/what-are-the-benefits-of-using-spl-arrayobject-arrayiterator-recursivearrayiter – 2010-11-30 23:04:14

+0

Как я читал в книге, ArrayIterators рекомендуются для Large Наборы данных. Для простых данных foreach Loop достаточно. Не уверен в ArrayAccess, поэтому ... – 2010-11-30 23:07:46

ответ

5

Нет функциональных преимуществ, но структурных.

Если вы определили карту, вы можете предположить, что она может содержать произвольное количество именованных элементов, которые имеют похожие типы. Свойства объекта обычно хорошо определены и разных типов.

Вкратце: если вы реализуете ArrayAccess, вы говорите: «Мой объект (также) ведет себя как массив».

http://en.wikipedia.org/wiki/Associative_array

4

Ну, для начала это облегчает или более естественным доступ к членам, чей ключ не формирует действительный идентификатор (например, содержит неудобные символы). Например, вы можете написать $form['some-field'] вместо более громоздкого $form->{'some-field'}.

Кроме этого, по существу такой же, как осуществление __get, __set, __isset, __unset магических методов, за исключением того, что позволяет другой синтаксис (и с несколько иными смысловыми коннотациями). См. overloading.

1

Использование интерфейсов делают более мощные инструменты, проще в использовании. Я использую его для коллекций вместе с Iterator. Это позволяет вашему объекту действовать как массив, даже если это не так. Сила происходит от того, чтобы не отображать имя свойства в элемент массива, но доступ к массиву делает что-то совершенно другое.

т.е.

 
$users = new UserCollection(); 
$users->company = $companyid; 
$user = $users[$userid]; 

// also 
foreach($users as $user) { 
    // Do something for each user in the system 
} 

В первой части, я создавая объект usercollection, и ограничивая его список пользователей, что и идентификатор компании. Затем, когда я получаю доступ к коллекции, я получаю пользователей с этим идентификатором от этой компании. Вторая часть позволяет мне перебирать каждого пользователя в компании.

Смежные вопросы