Статьи

Реализация ArrayAccess для простого использования массива

На прошлой неделе я использовал PHP-класс DOMDocument для работы с некоторыми поколениями XML. Это очень похоже на манипулирование DOM Javascript. XML, который я генерировал, представлял собой набор элементов с ключевыми атрибутами. (<item key = ”object”>) Изучение того, как расширить новый класс таким образом, чтобы он вел себя как PHP-массив, привело меня в восторг от PHP ! Давайте углубимся в магию.

arrayaccess.jpg

Мне нужно было создать в XML:

<item key="object">DOMAIN</item>

Мне нужно было создавать элементы такого рода для различных свойств, чтобы общаться с API домена. Поскольку это по сути хеш или ассоциированный массив, было бы здорово, если бы он мог работать как один. Ну, это может!

$dt_assoc['object'] = 'DOMAIN';

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

Вышеприведенный оператор вызывает ArrayAccess :: offsetSet ($ offset, $ value); Итак, вот реализация.

public function offsetSet($offset,$value) {
$item = $this->dom->createElement('item',$value);
$attr = $this->dom->createAttribute('key');
$item->appendChild($attr);
$text = $this->dom->createTextNode($offset);
$attr->appendChild($text);

$this->items[$offset] = $item;
$this->el->appendChild($item);
}

Используя DOMDocument для создания XML, я создаю элемент, обернутый вокруг значения, создаю атрибут с именем key и даю текст смещения. Поэтому вместо того, чтобы записывать этот процесс для каждого нового элемента, мне просто нужно установить новый ключ и значение объекта, который реализует этот интерфейс.

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

Конструктор берет имя элемента, чтобы обернуть все элементы, а также экземпляр DOMDocument. Вы должны держаться за оригинальный экземпляр. Этот класс создает XML-элемент из <$ name> items go here </ $ name> .

Массив $ data является ассоциированным массивом в объекте, чтобы отслеживать все значения каждого элемента. Элементы массива хранят ссылку на узлы элементов в DOMDocument, поэтому их можно легко удалить с помощью offsetUnset () .

offsetExists просто проверяет, существует ли элемент с ключом смещения, а offsetGet возвращает значение элемента с соответствующим ключом.

Наконец, toXML()это новая функция, не связанная с ArrayAccess, но полезная для меня, которая просто возвращает DOMElement, который удерживает все эти элементы.

Вот полный класс. Вам также пригодятся DOMDocument и ArrayAccess , если вам нужно сделать что-то подобное.

<?php
class SRSData implements ArrayAccess {

var $el;
var $dom;
var $data;
var $items;

public function __construct($name,$dom) {
$this->dom = $dom;
$this->el = $this->dom->createElement($name);
}

public function offsetExists($offset) {
return isset($this->items[$offset]);
}

public function offsetGet($offset) {
return $this->data[$offset];
}

public function offsetSet($offset,$value) {
if($value instanceof SRSData) {
$item = $this->dom->createElement('item');
$item->appendChild($value->toXML());
} else {
if(!empty($value))
$item = $this->dom->createElement('item',$value);
else
$item = $this->dom->createElement('item');
}
$this->data[$offset] = $value;
$attr = $this->dom->createAttribute('key');
$item->appendChild($attr);
$text = $this->dom->createTextNode($offset);
$attr->appendChild($text);

$this->items[$offset] = $item;
$this->el->appendChild($item);
}

public function offsetUnset($offset) {
$this->el->removeChild($this->items[$offset]);
unset($this->data[$offset]);
unset($this->items[$offset]);
}

public function toXML() {
return $this->el;
}

}
?>

Изучение этого было одним из тех моментов, когда я действительно был рад программированию. Надеюсь, это поможет показать, насколько мощный PHP на самом деле.

Предоставлено McArthur GFX .