Интерфейс ArrayAccess в PHP
Данная статья является продолжением предыдущей статьи, посвященной теме итераторов в PHP. В ней пойдет речь о PHP интерфейсе ArrayAccess. Он позволяет нам создавать объекты, доступ к содержимому которых может быть получен с использованием синтаксиса применяемого для работы с массивами.
Интерфейс ArrayAccess содержит четыре метода:
- offsetSet - для установки значения в массиве по ключу
- offsetGet - для получения значения из массива по ключу
- offsetExists - проверка существования значения в массиве по указанному ключу
- offsetUnset - удаление значения из массива по ключу
Теперь у нас есть возможность работать, например, с базами данных как с простыми массивами, легко добавляя или удаляя элементы - записи базы данных. Возможный пример:
<?php
// получаем экземпляр базы данных
$db = DB::getInstance();
// добавили запись в базу данных без каких-либо SQL запросов
// вся логика работы с SQL находится в классе базы данных
// а у нас лишь удобный интерфейс наподобие массива
$db[] = [
"title" => "Новая статья",
"date" => date("d/M/Y",time()),
"content" => "Привет всем!"
];
// а здесь получаем запись по идентификатору
$postId = 100;
$post = $db["{$postId}"];
// проверяем, существует ли запись в базе данных
if( isset($db["{$postID}"]) )
print_r($post);
// удаляем запись из базы
unset($db["{$postId}"]);
?>
В коде выше показан пример того как может быть реализована работа с записями в базе данных. В качестве источников баз данных могут служить JSON, CSV файлы, тот же MySQL, например, все зависит от Ваших практических потребностей.
А вот уже более реальный код, который можно скопировать и запустить. В примере рассматривается класс HtmlPage, представляющий html-страницу. Он реализует интерфейс ArrayAccess, благодаря чему с объектом этого класса можно работать как с обычным массивом. Также в классе HtmlPage мы переопределяем метод __toString() для удобного преобразования в строку.
Вот код:
<?php
// исключение, возникающее при попытке доступа к
// значению, чей ключ не определен
class OffsetNotFoundException extends Exception {}
// пример объекта, работающего как массив
class HtmlPage implements ArrayAccess
{
// внутренний массив к которому мы создаем интерфейс доступа
private $storage = [];
//Пример запуска из файла index.php:
//
// require_once 'HtmlPage.php';
// HtmlPage::main($argv);
public static function main(array $args = [] )
{
// Пример №1
// создаем объект html-страницы
$page = new HtmlPage();
// добавляем элемент, (вызывается метод offsetSet)
$page["title"] = "Интерфейс ArrayAccess в PHP";
$page["author"] = "Михаил Русаков";
$page["description"] = "Учимся использовать интерфейс ArrayAccess в PHP.";
$page["keywords"] = "php, php arrayaccess";
$page["preview"] = "Введение";
$page["content"] = "Содержание";
// распечатываем страницу
print $page;
self::separator();
// Пример №2
// получаем значения (вызывается метод offsetGet)
try {
$title = $page["title"];
$author = $page["author"];
// оопс! такого значения не существует,
// поэтому будет брошено исключение OffsetNotFoundException,
// определенное нами раннее
$tag = $page["tag"];
} catch ( OffsetNotFoundException $e ) {
print sprintf("Ошибка '%s' на строке %d\n",$e -> getMessage(),$e -> getLine());
}
// проверяем наличие значения в объекте
if( isset($page["preview"]) )
print $page["preview"] . PHP_EOL;
else
print "Нет ключа" . PHP_EOL;
}
// вспомогательный метод, просто печатающий длинный разделитель
public static function separator()
{
print PHP_EOL . '-----------------------------------------------' . PHP_EOL;
}
// существует ли ключ во внутреннем массиве
public function offsetExists($offset)
{
return isset($this -> storage[$offset]);
}
// возвращает значение из внутреннего массива, если
// существует ключ, соответствующий этому значению,
// в противном случае выбрасывает исключение
public function offsetGet($offset)
{
if( $this -> offsetExists($offset) )
return $this -> storage[$offset];
else
throw new OffsetNotFoundException("Невозможно найти указанный ключ!");
}
// установка значения по указанному ключу
// если такой ключ уже существует, то
// значение, соответствующее этому ключу
// будет перезаписано
public function offsetSet($offset, $value)
{
$this -> storage[$offset] = $value;
}
// удаляет элемент во внутреннем массиве
public function offsetUnset($offset)
{
unset($this -> storage[$offset]);
}
// преобразуем содержимое нашего массива в строку
public function __toString()
{
return implode("\n",$this -> storage);
}
}
?>
Как видите вкупе с использованием итераторов, использование PHP интерфейса ArrayAccess дает нам возможность работать с объектами так, как будто они являются массивами. Таким образом, мы можем использовать интерфейс ArrayAccess для организации удобной работы с собственными классами.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.