В php, насколько похож на массив я могу заставить объект действовать?И как бы я это сделал? - PullRequest
2 голосов
/ 12 июля 2010

Я знаю, что, реализовав iterable, вы можете создать объект, способный foreach редактироваться.Я хотел бы пойти дальше и заставить объект реагировать так, как если бы массив вызывался в максимально возможном количестве мест, где требуется массив.

(Причина этого в том, что я выбираю данные избаза данных, и объект оператора, который получается по умолчанию, очень хорош для памяти, тогда как полный набор данных в форме массива имеет тенденцию выбрасывать использование памяти на орбиту. Я хотел бы иметь лучшее из обоих миров, использование типа массива с меньшимиспользование памяти до того момента, пока не будет вызван тип поведения массива.)

Ответы [ 3 ]

6 голосов
/ 12 июля 2010
  • Вы можете сделать свой объект Счетным , чтобы он работал с count
  • Вы можете реализовать ArrayAccess , чтобы синтаксис, подобный $obj['index'], работал.
  • Как и вы, вы можете реализовать Итератор или IteratorAggregate .

Что вы не можете сделать :

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

  • end, prev, next, reset, current, key
  • array_walk, array_walk_recursive, array_key_exists.
2 голосов
/ 12 июля 2010

Посмотрите на интерфейсы ArrayAccess и Countable. Первый позволяет получить доступ к вашему объекту с помощью $obj[...], второй позволяет count($obj);

1 голос
/ 12 июля 2010

Не знаю, нужно ли это вам, но вы можете:

// $your_object

foreach(get_object_vars($your_object) as $property=>$value) /* do something */ ;

Если память мне не изменяет, вы можете (взаимозаменяемо) использовать приведение типов в любом месте.

Возможно, это не считается конфетой ООП, но это обязательный элемент, который работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...