Статьи

Объектно-ориентированное программирование в WordPress: управляющие структуры II

Если вы следили за нами на протяжении всей этой серии, то вы, несомненно, знаете, что мы смотрим на концепции объектно-ориентированного программирования с точки зрения начинающего.

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

В конечном счете, мы работаем над созданием практического примера объектно-ориентированного программирования путем создания плагина WordPress. Но прежде чем мы это сделаем, нам нужно обсудить еще несколько вещей.

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

До этого момента мы рассмотрели следующие темы.

  1. Введение
  2. Классы
  3. Типы
  4. Управляющие структуры: условные высказывания

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

Если вы читали предыдущую статью, то вспомните, что «управляющие структуры» относятся к конструкциям, предоставляемым языком (в нашем случае, PHP), которые позволяют нам изменять код в программе в зависимости от ряда условий.

В прошлой статье мы рассмотрели, как мы можем сделать это с помощью условных операторов, которые являются операторами, которые вынуждают программу идти по пути выполнения на основе условного выражения (например, если переменная установлена, если условие истинно , и так далее).

Но это не единственный тип контроля, который мы имеем. В дополнение к условным обозначениям у нас есть возможность выполнять итерации (или циклы) по наборам данных, чтобы мы могли выполнять действия с каждым элементом в наборе данных. Мы можем добавлять данные, удалять данные, отображать данные, сортировать данные и многое другое.

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

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

Цикл for часто считается самым сложным из циклов из-за природы написания кода. Поток это выглядит немного неестественно.

Как правило, мы привыкли писать код построчно, чтобы каждая инструкция была в одной строке; однако, for циклов for у нас немного другой подход. Сначала я поделюсь базовым примером, рассмотрим его аспекты, а затем рассмотрим более детальный подход.

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

1
2
3
for ( $i = 0; $i < 10; $i++ ) {
    echo $i;
}

В первой строке цикла (в скобках после оператора for ) мы делаем следующее:

  • инициализация переменной $i и установка ее равной нулю
  • установив условие для продолжения работы, пока $i < 10
  • увеличение $i на значение 1 (с использованием оператора постинкремента ) после каждой итерации

В теле цикла мы просто используем PHP-функцию echo для вывода текущего значения $i . По мере того, как цикл обрабатывает инструкции, мы увидим 0 — 9, распечатанные на экране (поскольку мы начинаем с нуля и работаем, пока $i меньше 10).

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

Если $ i начинается с нуля, а $ i меньше 10, выполните тело цикла, а затем увеличьте $ i на 1.

Уловка в том, что $i может начинаться с любого значения, может рассчитывать до произвольной суммы и может увеличиваться на любое значение.

Чем больше работы мы выполняем for циклов, тем больше у вас шансов поймать несколько вещей, которые могут оптимизировать производительность. На данный момент, однако, основы цикла for были рассмотрены, и передовые методы немного выходят за рамки данной статьи.

Циклы foreach похожи на циклы for, поскольку они выполняют итерацию по набору данных, но делают это последовательно. Это означает, что не существует простого способа перебрать все, скажем, два элемента в списке (как вы можете, скажем, с $i + 2 в циклах for ).

Этот тип цикла, пожалуй, самый читаемый. Для нашего примера, давайте предположим, что у нас есть массив, и массив данных содержит следующие имена: Альфа, Браво, Чарли, Дельта, Эхо и Фокстрот. Имя массива хранится в переменной с именем $names .

В этом случае мы можем настроить цикл foreach чтобы перебирать имена и отображать каждое из них на экране следующим образом:

1
2
3
4
$names = array( ‘Alpha’, ‘Bravo’, ‘Charlie’, ‘Delta’, ‘Echo’, ‘Foxtrot’ );
foreach ( $names as $name ) {
    echo $name;
}

Довольно легко настроить, не так ли?

Так же, как мы разделили один способ чтения начального цикла for в предыдущем разделе, вы можете прочитать цикл foreach следующим образом:

Для каждого имени в коллекции имен, отобразите его на экране.

Или, возможно, в более общем плане:

Для каждого элемента в коллекции, отобразите его на экране.

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

Например, предположим, что у нас есть следующий ассоциативный массив:

1
$heroes = array( ‘alien’ => ‘Superman’, ‘human’ => ‘Batman’ );

При использовании ассоциативного массива, подобного этому, вы также можете настроить цикл foreach следующим образом:

1
2
3
foreach ( $heroes as $type => $name ) {
    echo $name .
}

Это приведет к тому, что в результате будет прочитано что-то вроде «Супермен — инопланетянин», потому что «Супермен» — это значение, а «инопланетянин» — это его тип (или его ключ).

Более общая форма этого цикла выглядит следующим образом:

1
2
3
foreach ( $collection as $key => value ) {
    // Work goes here
}

Ничего страшно сложного.

Рассмотрев варианты циклов for , пришло время обратить внимание на циклы while в которых есть два варианта (хотя они называются чем-то другим: циклы while циклы do ), но они отличаются лишь незначительным образом.

Но прежде чем мы рассмотрим, как они отличаются, давайте взглянем на цикл while, его основной формат, как его использовать и как он сравнивается с предыдущим циклом for .

Во-первых, основной формат цикла while следующий:

1
2
3
while ( condition ) {
    // do work
}

Обратите внимание, что этот цикл отличается от наших предыдущих циклов тем, что он принимает условное выражение как часть исходного утверждения (поэтому мы и рассмотрели условные выражения в нашей последней статье).

Цикл работает, сначала проверяя, выполняется ли условие, выполняя блок кода в теле цикла, а затем снова проверяя условие. Это означает, что циклы while могут выполнять любую единицу работы, если заданное условие имеет значение true.

Так что, конечно, вы можете перебирать список чисел, проходить через набор данных, но вы также можете делать определенные вещи, в то время как, скажем, логическое значение все еще верно. И как только флаг достигнет false, цикл while прекратится.

Давайте посмотрим на пример, где мы выталкиваем элементы из массива. Давайте предположим, что исходный массив имеет 100 элементов, и мы будем делать это до тех пор, пока в массиве не останется 50 элементов:

1
2
3
while ( 50 !== count ( $elements ) ) {
    array_pop( $elements );
}

Здесь условие будет продолжать оцениваться как true, пока количество элементов в массиве $elements не будет уменьшено до 50 элементов.

Как мы сделали с предыдущими циклами, это один из способов прочитать цикл while:

Пока это условие выполняется, выполните следующий код.

Конечно, так оно и есть в коде, не так ли?

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

Прежде чем взглянуть на пример, вот базовая структура цикла do :

1
2
3
do {
    // do work
} while ( condition );

Относительно ясно, верно?

Итак, давайте настроим очень простой пример, в котором мы создаем массив и заполняем его только четными числами. Для этого нам нужно:

  • массив для хранения чисел
  • переменная для хранения того, сколько раз мы повторяли первые 100 четных чисел

С учетом сказанного можно настроить код так:

01
02
03
04
05
06
07
08
09
10
11
12
$i = 1;
$even_numbers = array();
 
do {
 
    if ( 0 === ( $i % 2 ) ) {
        $even_numbers[] = $i;
    }
     
    $i++;
 
} while ( $i <= 100 );

И, наконец, как и с остальными циклами, вы можете читать эти типы циклов следующим образом:

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

Когда дело доходит до циклов, если вы работаете с коллекцией, вы должны убедиться, что коллекция не пуста, прежде чем работать с ней, потому что она выполнит код в блоке цикла, прежде чем проверять, выполняется ли условие правда. Это может привести к ошибкам, если вы попытаетесь работать с пустым набором данных.

Конечно, если это то, что вы планируете сделать, то один из других циклов лучше оптимизирован для такого рода операций.

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

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

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