<MyRusakov.ru />

PHP и MySQL с Нуля до Гуру 2.0

PHP и MySQL с Нуля до Гуру 2.0

Данный курс научит Вас программировать на самом популярном Web-языке в мире - PHP. Курс состоит из 11 разделов, в которых с нуля рассказывается и показывается процесс написания различных скриптов на PHP.

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

Почти к каждому уроку идут упражнения.

Просмотрев данный курс, Вы сможете создавать абсолютно любые PHP-сайты любой сложности.

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

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

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

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

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

Каким движком Вы предпочитаете пользоваться?

Итераторы в PHP. Введение

Итераторы в PHP. Введение

Как известно, важнейшим элементом в языке программирования PHP являются массивы. И это не удивительно, так как практически всегда приходится работать с какими-либо наборами данных. В PHP массивы - ассоциативные, т.е., хранят пары ключ-значение. Ключ массива должен быть либо типа int, либо типа string, а значение может быть любого типа. Массивы в PHP поистине универсальны.

Вот пример операций с массивом:

<?php

  $array = [
   'a' => 1,
   'b' => 2,
   'c' => [ 'd', 'e', 'f' ],
  ];

    // добавляем новое значение в массив
  $array['x'] = 'Значение 1';

    // а здесь индекс формируется автоматически, ( он будет числовой )
  $array[] = 'Значение 2';

    // в PHP 7 появилась новая особенность
  // "распаковка" массива, операция-синоним конструкции list()
  [$a, $b, $c, $x, $n ] = $array;

    // тоже самое, что и пример выше
  list($a, $b, $c, $x, $n) = $array;

?>

Существуют около сотни функции для работы с массивами в PHP. С ними можно ознакомиться на официальном сайте языка.

В добавок ко всем этим функциям, самым главным свойством массивом - является возможность перебора всех элементов, для получения либо ключа, либо значения, либо того и другого сразу. Т.е. итерация по массиву, или процесс прохода по массиву в PHP играет исключительно важное значение. И, несмотря на простоту концепции итерации, за ней кроются мощные возможности, которые можно использовать для перебора любых видов коллекций данных. Фактически процесс итерации обеспечивает нам возможность одинаково работать с любым итерируемым (перебираемым) объектом, а не только с массивом. Т.е. мы можем реализовать следующее:

<?php

  class MyClass
  {
    // общедоступное поле
    public $public = "Public Property";

    // защищенное поле
    protected $protected = "Protected Property";

    // закрытое поле
    private $private = "Private Property";

  }

 
  $myclass = new MyClass();
  foreach( $myclass as $prop ) {
    echo $prop, PHP_EOL;
  }


  // Напечатает
  // Public Property

?>

Как видно из примера выше, мы можем пройтись по объекту словно по массиву. Но напечатано будет только значение общедоступного свойство, так как защищенные и закрытые поля класса не могут быть прочитаны в цикле. Хотя, практическая польза итерации по свойствам объекта сомнительна, она показывает, что объекты в PHP являются итерируемыми сущностями.

Теперь перейдем непосредственно к примеру. При создании сайтов, а точнее, при написании их программной части, часто используем класс, представляющий хранилище каких-либо настроек, которые можно добавлять и затем получать при необходимости. Такой класс может называться, например, Registry. Вот код:

<?php

  // класс хранилища данных
  class Registry
  {
    // массив, в котором хранятся настройки
    private $options = [];

    // метод для добавления настройки в хранилище
    public function set($option, $value)
    {
    $this -> options[$option] = $value;
    }

    // метод для получения настройки из хранилища
    public function get($option) {
    {
    return $this -> options[$option];
    }
  }

?>

Как видно, это простой класс для работы с настройками приложения. Однако, что, если вдруг нам нужно будет пройтись по всем настройкам в хранилище и сделать с ними какую-либо операцию. Но ведь у класса Registry нет открытых свойств, что делать в этом случае? Первое, что приходит в голову это добавить новый открытый метод getOptions() который будет возвращать массив настроек целиком, однако это плохая идея, так как любое случайное изменение в нем может повлиять на все приложение. Поэтому нам нужно другое решение, и это решение - итераторы. В классе Registry мы реализуем интерфейс Iterator. Код:

<?php

// класс хранилища данных, реализующий интерфейс Iterator
class Registry implements Iterator
{
    // массив, в котором хранятся настройки
    private $options = [];

    // возвращает текущий элемент
    public function current()
    {
      return current($this -> options);
    }

    // возвращает ключ текущего элемента
    public function key()
    {
      return key($this -> options);
    }

    // передвигаемся вперед на один элемент
    public function next()
    {
      next($this -> options);
    }

    // возвращает указатель на начало массива
    // фактически мы начинаем считать заново с нуля
    public function rewind()
    {
      reset($this -> options);
    }

    // проверяет, достигли ли мы конца массива
    public function valid()
    {
      return current($this -> options) !== false;
    }

    // метод для добавления настройки в хранилище
    public function set($option, $value)
    {
      $this -> options[$option] = $value;
      return $this;
    }

    // метод для получения настройки из хранилища
    public function get($option)
    {       return $this -> options[$option];
    }

}

?>

Запуск:

<?php

 // создали объект
 $reg = new Registry();

 // добавили настройки
 $reg -> set("DS",DIRECTORY_SEPARATOR)
    -> set("APP_HOME", '.')
    -> set("AUTO_RELOAD",true)


 // и прошлись по настройкам.
 // обратите внимание - никаких массивов, только объект $reg

 foreach ( $reg as $option => $value ) {
  echo $option, " = ", $value, PHP_EOL;
 }

?>

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

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

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

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

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

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

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

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

  1. Кнопка:

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

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

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

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

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

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