<MyRusakov.ru />

Профессия Web-разработчик

Профессия Web-разработчик

Этот комплект за 8 месяцев превратит Вас в Web-разработчика с нуля. Учиться достаточно 1 час в день.

Начнёте Вы с HTML, CSS и вёрстки сайтов. Потом перейдёте к программированию и JavaScript. Затем изучите PHP, MySQL, SQL, Python. Изучите Web-фреймворки Laravel и Django. Создадите 5 своих сайтов для портфолио.

Комплект содержит:

- 540 видеоуроков

- 110 часов видео

- 1205 заданий для закрепления материала из уроков

- 5 финальных тестов

- 7 сертификатов

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Интерфейс ArrayAccess в PHP

Интерфейс 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 для организации удобной работы с собственными классами.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.