1

Зачем нужен PHP?

Обсудим диалог клиента и сервера при отсутствии [[PHP]]. На рисунке 1 все реплики пронумерованы.

  1. Вы вводите www.example.com/catalog.html в строке веб-адреса, находящейся в верхней части окна браузера.
  2. Браузер посылает сообщение через Интернет на компьютер по адресу www.example.com, запрашивая страницу /catalog.html.
  3. НТТР-сервер Apache, работающий на компьютере по адресу www.example.com, получает сообщение и читает файл catalog.html из своего накопителя на жестких дисках.
  4. Веб-сервер посылает содержимое файла обратно на ваш компьютер через Интернет в качестве ответа на запрос браузера.
  5. Браузер отображает страницу на экране вашего компьютера, следуя инструкциям, указанным в дескрипторах НТМL-разметки данной страницы.

Связи клиента с сервером без PHP
Связи клиента с сервером без PHP

Всякий раз, когда браузер запрашивает страницу по адресу www.example.com/catalog.html, веб-сервер посылает обратно содержимое того же самого файла catalog.html. Ответ веб-сервера изменится лишь в том случае, если кто-нибудь отредактирует запрашиваемый файл на сервере. Но если задействовать РНР, то сервер сможет сделать нечто большее со своей стороны диалога. На рисунке 2 наглядно показано, что произойдет, когда веб-браузер запросит страницу, сгенерированную средствами РНР.

Отдельные реплики рассматриваемого здесь диалога с участием [[PHP]] пронумерованы на рисунке 2.

  1. Вы вводите www.example.com/catalog/yak.php в строке веб-адреса, находящейся в верхней части окна браузера.
  2. Браузер посылает сообщение через Интернет на компьютер по www.example.com, запрашивая страницу /catalog/yak.php.
  3. НТТР-сервер Apache, работающий на компьютере по адресу www.example.com, получает сообщение и обращается к интерпретатору РНР, также работающему на компьютере по адресу www.example.com, со следующим вопросом: «Как выглядит страница /catalog/yak.php
  4. Интерпретатор РНР читает файл yak.php из накопителя на жестких дисках.
  5. Интерпретатор РНР выполняет команды из файла yak.php, возможно, обмениваясь данными с системой управления базой данных, например MySQL.
  6. Интерпретатор РНР принимает результат выполнения программы из файла yak.php и посылает его обратно на НТТР-сервер Apache в качестве ответа на вопрос «Как выглядит страница /catalog/yak.php
  7. НТТР-сервер Apache посылает содержимое страницы, полученное обратно от интерпретатора РНР, на ваш компьютер через Интернет в ответ на запрос браузера.
  8. Этот браузер отображает страницу на экране вашего компьютера, следуя инструкциям, указанным в дескрипторах НТМL-разметки данной страницы.

Связи клиента с сервером c PHP
Связи клиента с сервером c PHP

[[PHP]] — это язык программирования. Программы на РНР представляют собой написанные на этом языке инструкции, которые читаются на компьютере веб-сервера, и на их основании решается, что делать дальше. Интерпретатор РНР следует инструкциям. Программисты нередко подразумевают под термином РНР интерпретируемый язык программирования. А здесь под термином РНР подразумевается средство, выполняющее команды из написанных на РНР программ и формирующее веб-страницы.




Структура PHP

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

Содержание урока

Комментарии

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

// Это комментарий

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

// echo "X equals $x";

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

$x += 10; // Увеличение значения $x на 10

Когда понадобится комментарий, состоящий из нескольких строк, нужно воспользоваться вторым способом комментирования, который показан ниже:

/* Это область
многострочного комментария,
которая не будет
подвергаться интерпретации */

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

Типичная ошибка — применение пар символов /* и */ для того, чтобы закомментировать большой фрагмент кода, уже содержащий закомментированную область, в которой используются эти же пары символов. Комментарии не могут быть вложенными друг в друга, поскольку PHP-интерпретатор не поймет, где заканчивается комментарий, и выведет на экран сообщение об ошибке. Но если вы используете редактор программ или интегрированную среду разработки с подсветкой синтаксиса, то ошибку такого рода нетрудно будет заметить.

Основной синтаксис

PHP — очень простой язык, уходящий своими корнями в [[язык C]] и [[Perl]], но все же больше похожий на [[Java]]. Он очень гибок, но существует несколько правил, относящихся к его синтаксису и структуре, которые следует изучить.

Точка с запятой

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

$x += 10;

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

Символ $

Символ $ используется в разных языках программирования в различных целях. Например, в языке BASIC символ $ применялся в качестве завершения имен переменных, чтобы показать, что они относятся к строкам. А в PHP символ $ должен ставиться перед именами всех переменных. Это нужно для того, чтобы PHP‑парсер работал быстрее, сразу же понимая, что имеет дело с переменной. К какому бы типу ни относились переменные — к числам, строкам или массивам, все они должны выглядеть так, как показано в ниже:

<?php
$mycounter = 1;
$mystring = "Hello";
$myarray = array("One", "Two", "Three");
?>

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

Переменные

Понять, что такое переменные PHP, поможет простая метафора. Думайте о них как о небольших (или больших) спичечных коробках! Именно как о спичечных коробках, которые вы раскрасили и на которых написали некие имена.

Строковые переменные

Представьте, что у вас есть коробок, на котором написано слово username (имя пользователя). Затем вы пишете на клочке бумаги Fred Smith и кладете эту бумажку в коробок. Этот процесс похож на присваивание переменной строкового значения:

$username = "Fred Smith";

Переменные можно представить в виде спичечного коробка,   содержащего какие-то предметы
Переменные можно представить в виде спичечного коробка,
содержащего какие-то предметы

Кавычки служат признаком того, что Fred Smith является строкой символов. Каждую строку нужно заключать либо в двойные, либо в одинарные кавычки (апострофы). Между этими двумя видами кавычек есть весьма существенное различие, которое будет рассмотрено далее. Когда хочется посмотреть, что находится внутри коробка, вы его открываете, вынимаете бумажку и читаете, что на ней написано. В PHP подобное действие выглядит следующим образом:

echo $username;

Можно также присвоить содержимое другой переменной (сделать ксерокопию бумажки и поместить ее в другой коробок):

$current_user = $username;

Если вы стремитесь самостоятельно освоить работу с PHP, то можете попробовать вводить примеры, приводимые в этом уроке, в интегрированную среду разработки (согласно рекомендациям, которые были даны ранее, чтобы тут же посмотреть на результаты, или же можете ввести код примера в текстовом редакторе и сохранить этот код в каталоге исходного источника документов вашего сервера под именем test1.php.

<?php // test1.php
$username = "Fred Smith";
echo $username;
echo "
"; $current_user = $username; echo $current_user; ?>

Теперь эту программу можно запустить, введя в адресную строку браузера следующий адрес:

http://localhost/test1.php

Результатом запуска этого кода будет двойное появление имени Fred Smith, первое — в результате выполнения команды echo $username, а второе — в результате выполнения команды echo $current_user.

Числовые переменные

Переменные могут содержать не только строки, но и числа. Если вернуться к аналогии со спичечным коробком, сохранение в переменной $count числа 17 будет эквивалентно помещению, скажем, 17 бусин в коробок, на котором написано слово count:

$count = 17;

Можно также использовать числа с плавающей точкой (содержащие десятичную точку); синтаксис остается прежним:

$count = 17.5;

Чтобы узнать о содержимом коробка, его нужно просто открыть и посчитать бусины. В PHP можно присвоить значение переменной $count другой переменной или вывести его с помощью браузера на экран, воспользовавшись командой echo.

Массивы

Массивы можно представить в виде нескольких склеенных вместе спичечных коробков. Например, нам нужно сохранить имена пяти футболистов одной команды в массиве $team. Для этого мы склеим вместе боковыми сторонами пять коробков, запишем имена всех игроков на отдельных клочках бумаги и положим каждый клочок в свой коробок.

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

$team = array('Bill', 'Mary', 'Mike', 'Chris', 'Anne');

Массив похож на несколько склеенных вместе спичечных коробков
Массив похож на несколько склеенных вместе спичечных коробков

Этот синтаксис несколько сложнее рассмотренных ранее инструкций. Код создания массива представляет собой следующую конструкцию:

array();

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

echo $team[3]; // Эта команда отображает имя Chris

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

Двумерные массивы

Диапазон использования массивов очень широк. Например, вместо выстраивания одномерных рядов коробков из них можно построить двумерную матрицу, а массивы могут иметь три и более измерения. Чтобы привести пример двумерного массива, представим, что нужно отслеживать ход игры в крестики-нолики, для чего требуется структура данных, состоящая из девяти клеток, сгруппированных в квадрат 3 × 3. Чтобы представить это в виде спичечных коробков, вообразите себе девять коробков, склеенных в матрицу, состоящую из трех строк и трех столбцов.

Многомерный массив, смоделированный с помощью коробков
Многомерный массив, смоделированный с помощью коробков

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

<?php
$oxo = array(array('x', ' ', 'o'),
array('o', 'o', 'x'),
array('x', 'o', ' ' ));
?>

Мы сделали еще один шаг к усложнению, но смысл его нетрудно понять, если усвоен основной синтаксис массива. Здесь три конструкции array() вложены во внешнюю по отношению к ним конструкцию array().
Для возвращения в дальнейшем третьего элемента во второй строке этого массива можно воспользоваться следующей PHP-командой, которая отобразит символ «x»:

echo $oxo[1][2];

Не забывайте о том, что отсчет индексов массива (указателей на элементы внутри массива) начинается с нуля, а не с единицы, поэтому в предыдущей команде индекс [1] ссылается на второй из трех массивов, а индекс [2] — на третью позицию внутри этого массива. Эта команда вернет содержимое третьего слева и второго сверху коробка.

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

Правила присваивания имен переменным

При создании PHP-переменных следует придерживаться четырех правил.

  1. Имена переменных должны начинаться с буквы или с символа _ (подчеркивания).
  2. Имена переменных могут содержать только символы: a–z, A–Z, 0–9 и _ (подчеркивание).
  3. Имена переменных не должны включать в себя пробелы. Если имя переменной нужно составить более чем из одного слова, то в качестве разделителя следует использовать символ подчеркивания (например, $user_name).
  4. Имена переменных чувствительны к регистру символов. Переменная $High_Score отличается от переменной $high_score.

Чтобы позволить использование ASCII-символов, включающих диакритические знаки, PHP также поддерживает в именах переменных байты от 127 и до 255. Но пока ваш код не будет поддерживаться только теми программистами, которые знакомы с такими символами, от их применения лучше отказаться, поскольку программисты, использующие английские раскладки клавиатуры, будут испытывать трудности при доступе к таким символам.

Операторы

Операторы — это математические, строковые, логические команды и команды сравнения, такие как «плюс», «минус», «умножить» и «разделить». Код PHP во многом похож на обычные арифметические записи. Например, в результате работы следующего оператора выводится число 8:

echo 6 + 2;

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

Арифметические операторы

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

Таблица. Арифметические операторы

Оператор
Описание
Пример
+
Сложение
$j + 1
Вычитание
$j – 6
*
Умножение
$j * 11
/
Деление
$j / 4
%
Модуль (остаток от деления)
$j % 9
++
Инкремент (приращение)
++$j
––
Декремент (отрицательное приращение)
––$j

Операторы присваивания

Эти операторы используются для присваивания значений переменным. К ним относится самый простой оператор =, а также операторы +=, –= и т. д. (см. таблицу). Оператор += вместо полного замещения находящегося слева значения добавляет к нему значение, которое находится справа от него. Итак, если переменная $count имела начальное значение 5, то оператор:

$count += 1;

устанавливает значение $count равным 6 точно так же, как более привычный оператор присваивания:

$count = $count + 1;

Таблица. Операторы присваивания

Оператор
Пример
Эквивалент
=
$j = 15
$j = 15
+=
$j += 5
$j = $j + 5
–=
$j –= 3
$j = $j – 3
*=
$j *= 8
$j = $j * 8
/=
$j /= 16
$j = $j / 16
.=
$j .= $k
$j = $j . $k
%=
$j %= 4
$j = $j % 4

У строк есть собственный оператор, точка (.), который более подробно будет рассмотрен в разделе Объединение строк.

Операторы сравнения

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

Таблица. Операторы сравнения

Оператор
Описание
Пример
==
Равно
$j == 4
!=
Не равно
$j != 21
>
Больше
$j > 3
<
Меньше
$j < 100
>=
Больше или равно
$j >= 15
<=
Меньше или равно
$j <= 8

Учтите, что операторы = и == предназначены для разных действий. Если первый является оператором присваивания, то второй — оператором сравнения. Иногда в спешке даже более опытные программисты могут вместо одного из них поставить другой, поэтому будьте внимательны, используя эти операторы.

Логические операторы

Если логические операторы вам раньше не встречались, то поначалу они могут показаться чем-то необычным. Нужно представить, что вы делаете логические заключения на простом разговорном языке. Например, можно сказать самому себе: «Если время уже больше 12, но меньше 14 часов, значит, нужно пообедать». В PHP код для такого высказывания может выглядеть следующим образом:

if ($hour > 12 && $hour < 14) dolunch();

Здесь набор инструкций для самого обеда помещен в функцию по имени dolunch, которую позже нужно будет создать. В этой инструкции отсутствует элемент then (тогда), поскольку его присутствие само собой разумеется. Как видно из предыдущего примера, логический оператор обычно используется для объединения результатов работы двух операторов сравнения, показанных в предыдущем разделе. Результат работы одного логического оператора может служить входным значением для другого логического оператора («Если время уже больше 12, но меньше 14 часов или же если в комнате пахнет жареным и тарелки уже стоят на столе...»). Как правило, если какое-то действие имеет истинное или ложное значение — TRUE или FALSE, оно может служить входным значением для логического оператора, который берет два истинных или ложных входных значения и выдает в качестве результата истинное или ложное значение. Логические операторы показаны в таблице.

Таблица. Логические операторы

Оператор
Описание
Пример
&&
И
$j == 3 && $k == 2
and
Низкоприоритетное И
$j == 3 and $k == 2
||
ИЛИ
$j < 5 || $j > 10
or
Низкоприоритетное ИЛИ
$j < 5 or $j > 10
!
НЕ
! ($j == $k)
xor
Исключающее ИЛИ
$j xor $k

Заметьте, что оператор && обычно взаимозаменяем с оператором and; то же самое справедливо и для операторов || и or. Но у операторов and и or более низкий приоритет, поэтому в некоторых случаях, для того чтобы принудительно расставить приоритеты, могут понадобиться дополнительные круглые скобки. В то же время бывают случаи, когда применимы только операторы and или or, как в следующем предложении, использующем оператор or:

mysql_select_db($database) or die("Невозможно выбрать базу данных");

Наиболее непривычным из этих операторов является xor, предназначенный для операции исключающего ИЛИ, который возвращает истинное значение TRUE, если любое из входных значений истинно, и возвращает ложное значение FALSE, если оба они имеют значение TRUE или FALSE. Чтобы понять его работу, представьте, что хотите изобрести чистящее средство для дома. Как аммиак (ammonia), так и хлорка (bleach) обладают хорошими чистящими свойствами, поэтому нужно, чтобы ваше средство содержало одно из этих веществ. Но оба они не могут в нем присутствовать, поскольку их сочетание опасно. В PHP это можно представить в следующем виде:

$ingredient = $ammonia xor $bleach;

В представленном фрагменте, если любая из двух переменных, $ammonia или $bleach, имеет значение TRUE, то значение переменной $ingredient также будет установлено в TRUE. Но если обе они имеют значение TRUE или значение FALSE, то значение переменной $ingredient будет установлено в FALSE.

Присваивание значений переменным

Синтаксис присваивания значения переменной всегда имеет вид переменная = значение. Для передачи значения другой переменной он имеет немного иной вид другая_переменная = переменная.
Есть еще несколько дополнительных операторов присваивания, которые могут оказаться полезными. Например, нам уже встречался оператор:

$x += 10;

Он предписывает PHP‑парсеру добавить значение, расположенное справа от него (в данном случае это значение равно 10), к значению переменной $x. Подобным образом можно вычесть значение:

$y -= 10;

Увеличение и уменьшение значения переменной на единицу Добавление или вычитание единицы — настолько часто встречающаяся операция, что PHP предоставляет для этого специальные операторы. Вместо операторов
+= и -= можно воспользоваться одним из следующих операторов:

++$x;
--$y;

В сочетании с проверкой (инструкцией if) можно воспользоваться таким кодом:

if (++$x == 10) echo $x;

Этот код предписывает PHP сначала увеличить значение переменной $x на единицу, а затем проверить, не имеет ли она значение 10; если переменная имеет такое значение, его следует вывести на экран. Можно также потребовать от PHP увеличить значение переменной на единицу (или, как в следующем примере, уменьшить на единицу) после того, как ее значение будет проверено:

if ($y-- == 0) echo $y;

что дает несколько иной результат. Предположим, что первоначальное значение переменной $y до выполнения оператора было равно нулю. Операция сравнения вернет результат TRUE, но после того, как она будет проведена, переменной $y будет присвоено значение –1. Тогда что же отобразит инструкция echo: 0 или –1? Попробуйте догадаться, а потом, чтобы подтвердить свою догадку, испытайте работу инструкции в PHP⏹процессоре. Поскольку такая комбинация операторов может вас запутать, ее можно применять только в качестве обучающего примера, но ни в коем случае не рассматривать в качестве приемлемого стиля программирования.

Короче говоря, когда именно увеличено или уменьшено на единицу значение переменной, до или после проверки, зависит от того, где помещен оператор инкремента или декремента — перед именем переменной или после него. Кстати, правильный ответ на предыдущий вопрос таков: инструкция echo отобразит результат –1, потому что значение переменной $y было уменьшено на единицу сразу же после того, как к ней получила доступ инструкция if, и до того, как к ней получила доступ инструкция echo.

Объединение строк

При объединении строк, когда к одной строке символов добавляется другая строка, используется символ точки (.). Самый простой способ объединения строк выглядит следующим образом:

echo "У вас " . $msgs . " сообщений.";

Если предположить, что переменной $msgs присвоено значение 5, то эта строка кода выведет следующую информацию:

У вас 5 сообщений.

Так же как с помощью оператора += можно добавить значение к числовой переменной, с помощью оператора .= можно добавить одну строку к другой:

$bulletin .= $newsflash;

В данном случае, если в переменной $bulletin содержится сводка новостей, а в переменной $newsflash — экстренное сообщение, команда добавляет это сообщение к сводке новостей, и теперь переменная $bulletin включает в себя обе строки текста.

Типы строк

В PHP поддерживаются два типа строк, которые обозначаются типом используемых кавычек. Если требуется присвоить переменной значение текстовой строки, сохраняя ее точное содержимое, нужно воспользоваться одинарными кавычками (апострофами):

$info = 'Предваряйте имена переменных символом $, как в данном примере: $variable';

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

echo "На этой неделе ваш профиль просмотрело $count человек ";

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

Изменение предназначения символов

Иногда в строке должны содержаться символы, которые имеют специальное предназначение и могут быть неправильно интерпретированы. Например, следующая строка кода не будет работать, потому что вторая кавычка (апостроф), встреченная в слове spelling's, укажет PHP‑парсеру на то, что достигнут конец строки. Следовательно, вся остальная часть строки будет отвергнута как ошибочная:

$text = 'My spelling's atroshus'; // Ошибочный синтаксис

Для исправления ошибки нужно непосредственно перед вызывающим неоднозначное толкование символом кавычки добавить обратный слеш (\), чтобы заставить PHP рассматривать этот символ буквально и не подвергать его интерпретации:

$text = 'My spelling\'s still atroshus';

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

$text = "She wrote upon it, \"Return to sender\".";

Кроме того, для вставки в строку различных специальных символов, например табуляции, новой строки и возврата каретки, могут применяться управляющие символы: \t, \n и \r соответственно. Вот пример, в котором символы табуляции используются для разметки заголовка (они включены в строку исключительно для иллюстрации применения символа обратного слеша, поскольку существуют более подходящие способы разметки веб-страниц):

$heading = "Дата\tИмя\tПлатеж";

Эти специальные символы, предваряемые символами обратного слеша, работают только в строках, заключенных в двойные кавычки. Если заключить предыдущую строку в одинарные кавычки, то вместо символов табуляции в ней будут отображены нелепые последовательности символов \t. Внутри строк, заключенных в одинарные кавычки, в качестве символов с измененным предназначением распознаются только измененный апостроф (\') и сам измененный обратный слеш (\\).

Многострочные команды

Иногда нужно вывести из PHP большой объем текста, а использование нескольких инструкций echo (или print) заняло бы много времени и было бы неразумным. PHP предлагает два удобных средства, предназначенных для того, чтобы справиться с подобной ситуацией. Первое из них состоит в заключении в кавычки нескольких строк. Переменным также можно присвоить значения способом, показанным в примерах ниже.

<?php
$author = "Steve Ballmer";
echo "Developers, Developers, developers, developers, developers,developers, developers, developers, developers! - $author.";
?>

 

<?php
$author = "Bill Gates";
$text = "Measuring programming progress by lines of code is like measuring aircraft building progress by weight. - $author.";
?>

В PHP можно также воспользоваться многострочной последовательностью, используя оператор <<<, который обычно называют here-document («здесь документ») или heredoc. Он представляет собой способ указания строкового литерала, сохраняющего в тексте обрывы строк и другие пустые пространства (включая отступы). Его использование показано в примере, где еще один вариант инструкции echo, использующей сразу несколько строк

<?php
$author = "Brian W. Kernighan";
echo <<<_END
Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are,
by definition, not smart enough to debug it.
- $author.
_END;
?>

Этот код предписывает PHP вывести все, что находится между двумя тегами _END, как будто все это является строкой, заключенной в двойные кавычки (за исключением того, что изменять предназначение кавычек в heredoc не нужно). Это означает, что разработчику можно, например, написать целый раздел HTML‑кода прямо в коде PHP, а затем заменить конкретные динамические части переменными PHP. Важно запомнить, что закрывающий тег _END; должен появляться строго в начале новой строки и быть единственным содержимым этой строки — к ней не разрешается добавлять даже комментарии (нельзя ставить даже одиночный пробел). Как только многострочный блок закрыт, можно снова воспользоваться тем же самым именем тега.

Запомните: используя heredocಉконструкцию <<<_END..._END;, вы не должны добавлять символы \n, чтобы отправить команду на перевод строки, достаточно просто нажать клавишу Enter и приступить к набору новой строки. В отличие от других строк, заключенных в одинарные или двойные кавычки, внутри конструкции heredoc можно по своему усмотрению совершенно свободно пользоваться всеми одинарными или двойными кавычками, не изменяя их первоначального предназначения с помощью обратного слеша (\).

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

<?php
$author = "Scott Adams";
$out = <<<_END
Normal people believe that if it ain't broke, don't fix it.
Engineers believe that if it ain't broke, it doesn't have enough
features yet.
- $author.
_END;
echo $out;
?>

После этого переменная $out будет наполнена содержимым, размещенным между двумя тегами. Если не присваивать, а добавлять значение, то для добавления строки к значению переменной $out вместо оператора = можно воспользоваться оператором .=. Будьте внимательны, не ставьте точку с запятой сразу же за первым тегом _END, поскольку она прервет многострочный блок еще до его начала и вызовет сообщение об ошибке синтаксического разбора — Parse error. Точку с запятой нужно ставить только после закрывающего тега _END, хотя внутри блока можно свободно пользоваться точкой с запятой как обычным текстовым символом. Кстати, тег _END — лишь один из многих, я выбрал его для этих примеров, поскольку его использование где-нибудь еще в коде PHP маловероятно, и поэтому он уникален. Вы можете использовать по собственному усмотрению любой тег, например _SECTION1 или _OUTPUT и т.д. И еще, чтобы отличать подобные теги от переменных или функций, обычно в начале их имени ставят знак подчеркивания; но если не хотите, можете им не пользоваться.

Многострочную разметку текста можно рассматривать как удобное средство, упрощающее чтение вашего кода PHP, поскольку, как только текст отображается на веб-странице, вступают в силу правила форматирования HTML и пустые пространства скрываются (но имя переменной $author по-прежнему заменяется ее значением в соответствии с правилами вставки значений переменных).

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

Типы переменных

PHP относится к очень слабо типизированным языкам. Это значит, что переменные не требуют объявления перед своим использованием и что PHP всегда преобразует переменные в тот тип, который требуется для их окружения на момент доступа к ним. Например, можно создать число, состоящее из нескольких цифр, и извлечь из него n-ю цифру, просто предположив, что это число является строкой. В следующем фрагменте кода перемножаются числа 12 345 и 67 890 и возвращается результат 838 102 050, который затем помещается в переменную $number.

<?php
$number = 12345 * 67890;
echo substr($number, 3, 1);
?>

Когда присваивается значение, $number является числовой переменной. Но во второй строке кода вызов значения этой переменной помещен в PHP-функцию substr, которая должна вернуть из переменной $number один символ, стоящий на четвертой позиции (не забывайте, что в отсчет позиции начинается с нуля). Для выполнения этой задачи PHP превращает $number в строку, состоящую из девяти символов, чтобы функция substr могла получить к ней доступ и вернуть символ, в данном случае 1. То же самое происходит при необходимости превратить строку в число и т.д. А в следующем примере переменной $pi присвоено строковое значение, которое затем в третьей строке кода автоматически превращается в число с плавающей точкой, чтобы стать частью уравнения по вычислению площади круга, которое выводит значение 78,539 817 5.

<?php
$pi = "3.1415927";
$radius = 5;
echo $pi * ($radius * $radius);
?>

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

Константы

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

define("ROOT_LOCATION", "/usr/local/www/");

Затем для чтения содержимого константы нужно просто сослаться на нее как на обычную переменную (но не предваряя ее имя знаком доллара):

$directory = ROOT_LOCATION;

Теперь, как только понадобится запустить ваш PHP-код на другом сервере с другой конфигурацией папок, придется изменить только одну строку кода.

Важно помнить о двух основных особенностях констант: перед их именами не нужно ставить символ $ (как перед именами обычных переменных) и их можно определить только с помощью функции define.

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

Предопределенные константы

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

Таблица. Волшебные константы PHP

Волшебная константа
Описание
__LINE__
Номер текущей строки в файле
__FILE__
Полное путевое имя файла. Если используется внутри инструкции include, то возвращается имя включенного файла. В версии PHP 4.0.2 __FILE__ всегда содержит абсолютный путь с раскрытыми символическими ссылками, а в предыдущих версиях при определенных обстоятельствах она может содержать относительный путь __DIR__ Каталог файла. Если используется внутри инструкции include, то возвращается каталог включенного файла. Такой же результат дает применение функции dirname(__FILE__). В этом имени каталога отсутствует замыкающий слеш, если только этот каталог не является корневым. (Добавлена в PHP 5.3.0)
__FUNCTION__
Имя функции. Начиная с PHP 5, возвращает имя функции, под которым она была объявлена (с учетом регистра символов). В PHP 4 возвращаемое значение всегда составлено из символов нижнего регистра. (Добавлена в PHP 4.3.0)
__CLASS__
Имя класса. Начиная с PHP 5, возвращает имя класса, под которым он был объявлен (с учетом регистра символов). В PHP 4 возвращаемое значение всегда составлено из символов нижнего регистра. (Добавлена в PHP 4.3.0)
__METHOD__
Имя метода класса. Возвращает имя метода, под которым он был объявлен (с учетом регистра символов). (Добавлена в PHP 5.0.0)
__NAMESPACE__
Имя текущего пространства имен (с учетом регистра символов). Эта константа определена во время компиляции. (Добавлена в PHP 5.3.0)

 

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

echo "Это строка " . __LINE__ . " в файле " . __FILE__;

Эта команда выведет в браузер текущую строку программы с указанием текущего файла, исполняемого в данный момент (включая путь к нему).

Различие между командами echo и print

Нам уже встречались разнообразные способы использования команды echo для вывода текста с сервера в браузер. В одних случаях выводится строковый литерал, в других сначала происходило объединение строк или вычисление значений переменных. Был также показан вывод, распространяющийся на несколько строк. Но команде echo есть альтернатива, которой также можно воспользоваться: команда print. Эти две команды очень похожи друг на друга, но print — конструкция, похожая на функцию, воспринимающую единственный параметр и имеющую возвращаемое значение (которое всегда равно 1), а echo — в чистом виде конструкция языка PHP.

В общем, команда echo работает при выводе обычного текста быстрее print, поскольку она не устанавливает возвращаемое значение. С другой стороны, поскольку она не является функцией, ее, в отличие от print, нельзя использовать как часть более сложного выражения. В следующем примере для вывода информации о том, является значение переменной истинным (TRUE) или ложным (FALSE), используется функция print, но сделать то же самое с помощью команды echo не представляется возможным, поскольку она выведет на экран сообщение об ошибке синтаксического разбора — Parse error:

$b ? print "TRUE" : print "FALSE";

Использование вопросительного знака — самый простой способ задать вопрос о том, какое значение имеет переменная $b, истинное или ложное. Команда, которая располагается слева от двоеточия, выполняется в том случае, если $b имеет истинное значение, а команда, которая располагается справа, выполняется, если $b имеет ложное значение. Тем не менее в приводимых здесь примерах чаще всего используется команда echo, и я рекомендую применять именно ее до тех пор, пока вам при PHP‑разработке реально не потребуется задействовать функцию print.

Функции

Функции используются для выделения блоков кода, выполняющих конкретную задачу. Например, если вам часто приходится искать какие-то данные и выводить их в определенном формате, то вполне разумно будет обратиться к функции. Код, выполняющий эту задачу, может занимать всего три строки, но, пока вы не воспользуетесь функцией, необходимость вставлять этот код в программу десятки раз делает ее неоправданно большой и сложной. А если вы чуть позже захотите изменить формат вывода данных, помещение кода в функцию будет означать, что вам придется внести изменения только в одном месте программы. Помещение кода в функцию не только сокращает размер исходного кода и делает его более удобным для чтения, но и дает дополнительные функциональные возможности (эта игра слов носит преднамеренный характер), поскольку функциям могут передаваться параметры, которые вносят изменения в характер их работы. Функции также могут возвращать значения вызывающему их коду. Чтобы создать функцию, нужно ее объявить, как показано в примере.

<?php
function longdate($timestamp)
{
    return date("l F jS Y", $timestamp);
}
?>

Эта функция использует в качестве входных данных отметку времени системы UNIX (целое число, отображающее дату и время на основе количества секунд, прошедших с нуля часов 1 января 1970 года), а затем вызывает PHP-функцию date с нужным форматом строки, чтобы вернуть дату в формате «Вторник май 2 2017». Между стоящими после имени функции круглыми скобками может размещаться любое количество параметров, но для этой функции выбран прием только одного параметра. Весь код, который выполняется при последующем вызове функции, заключается в фигурные скобки. Чтобы с помощью этой функции вывести сегодняшнюю дату, нужно поместить в свой код следующий вызов:

echo longdate(time());

В этом вызове для извлечения текущей отметки времени UNIX и передачи ее только что созданной функции longdate, которая затем возвращает для отображения соответствующую строку команде echo, используется встроенная PHP-функция time. Если требуется вывести дату семнадцатидневной давности, нужно сделать следующий вызов:

echo longdate(time() - 17 * 24 * 60 * 60);

в котором функции longdate передается текущая отметка времени UNIX, уменьшенная на количество секунд, которое прошло за 17 дней (17 дней, 24 ч, 60 мин, 60 с). Функции могут также воспринимать несколько параметров и возвращать несколько результатов, используя технологию, которая будет рассмотрена в следующих главах.

Область видимости переменной

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

Локальные переменные

Локальные переменные создаются внутри функции, и к ним имеется доступ только из кода этой функции. Обычно это временные переменные, которые используются до выхода из функции для хранения частично обработанных результатов. Одним из наборов локальных переменных является перечень аргументов функции. В предыдущем разделе была определена функция, воспринимающая параметр по имени $timestamp. Значение этого параметра действительно только в теле функции, за пределами этой функции его значение нельзя ни получить, ни установить. Чтобы привести еще один пример локальной переменной, рассмотрим функцию longdate еще раз в немного измененном варианте.

<?php
function longdate($timestamp)
{
    $temp = date("l F jS Y", $timestamp);
    return "Дата: $temp";
}
?>

В этом примере значение, возвращенное функцией date, присваивается временной переменной $temp, которая затем вставляется в строку, возвращаемую определяемой функцией. Как только будет осуществлен выход из функции, значение переменной $temp удаляется, как будто она вообще никогда не использовалась. Теперь, чтобы посмотреть на области видимости переменных в действии, изучим похожий код, показанный в примере. Здесь переменная $temp была создана еще до вызова функции longdate.

Неудачная попытка получить доступ к переменной $temp в функции longdate

<?php
$temp = "Дата: ";
echo longdate(time());
function longdate($timestamp)
{
    return $temp . date("l F jS Y", $timestamp);
}
?>

Но поскольку переменная $temp не была создана внутри функции longdate, а также не была передана ей в качестве параметра, функция longdate не может получить к ней доступ. Поэтому этот фрагмент кода выведет только дату без предшествующего ей текста. На самом деле сначала будет отображено сообщение об ошибке, предупреждающее об использовании неопределенной переменной (Notice: Undefined variable: temp). Причина в том, что по умолчанию переменные, созданные внутри функции, являются локальными для этой функции, а переменные, созданные за пределами любой функции, могут быть доступны только из того кода, который не входит в код ни одной из функций. В примерах ниже показано несколько способов исправления кода, приведенного в примере выше. Решить проблему можно путем переноса ссылки на переменную $temp в ее локальную область видимости

<?php
$temp = "Дата: ";
echo $temp . longdate(time());
function longdate($timestamp)
{
    return date("l F jS Y", $timestamp);
}  
?>

Здесь ссылка на $temp перемещена за пределы функции. Эта ссылка появляется в той же области видимости, в которой была определена переменная. Альтернативное решение: передача $temp в качестве аргумента

<?php
$temp = "Дата: ";
echo longdate($temp, time());
function longdate($text, $timestamp)
{
    return $text . date("l F jS Y", $timestamp);
}
?>

Здесь принято другое решение: передать значение переменной $temp функции longdate в качестве дополнительного аргумента. Функция longdate считывает это значение во временную переменную, которую она создает под именем $text, и выводит желаемый результат.

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

Глобальные переменные

Бывают случаи, когда требуется переменная, имеющая глобальную область видимости, поскольку нужно, чтобы к ней имелся доступ из всего кода программы. К тому же некоторые данные могут быть настолько объемными и сложными, что их не захочется передавать функциям в качестве аргументов. Чтобы объявить переменную, имеющую глобальную область видимости, используется ключевое слово global. Предположим, что существует некий способ входа пользователей на ваш сайт и нужно, чтобы весь код программы знал, с кем он имеет дело — с зарегистрированным пользователем или с гостем. Один из способов решения этой задачи заключается в создании глобальной переменной $is_logged_in:

global $is_logged_in;

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

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

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

Статические переменные

В пункте «Локальные переменные» выше было упомянуто, что значение переменной стирается сразу же после выхода из функции. Если функция вызывается многократно, она начинает свою работу со свежей копией переменной и ее прежние установки не имеют никакого значения. Интересно, а что, если внутри функции есть такая локальная переменная, к которой не должно быть доступа из других частей программы, но значение которой желательно сохранять до следующего вызова функции? Зачем? Возможно, потому, что нужен некий счетчик, чтобы следить за количеством вызовов функции. Решение, показанное ниже заключается в объявлении статической переменной.

<?php
function test()
{
    static $count = 0;
    echo $count;
    $count++;
}
?>

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

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

<?php
static $int = 0;         //	Допустимо
static $int = 1+2;       //	Недопустимо (вызовет ошибку синтаксического разбора (Parse error))
static $int = sqrt(144); //	Недопустимо
?>

Суперглобальные переменные

Начиная с версии PHP 4.1.0, стали доступны некоторые предопределенные переменные. Они известны как суперглобальные переменные. Смысл этого названия заключается в том, что они предоставляются средой окружения PHP и имеют глобальную область видимости внутри программы, то есть доступны абсолютно из любого ее места.
В этих суперглобальных переменных содержится масса полезной информации о текущей работающей программе и ее окружении (таблице "Суперглобальные переменные PHP"). Такие переменные имеют структуру ассоциативных массивов, которые будут рассмотрены в главе 6.

Таблица. Суперглобальные переменные PHP

Имя суперглобальной переменной
Ее содержимое
$GLOBALS
Все переменные, которые на данный момент определены в глобальной области видимости сценария. Имена переменных служат ключами массива
$_SERVER
Информация о заголовках, путях, местах расположения сценариев. Элементы этого массива создаются веб-сервером, и это не дает гарантии, что каждый веб-сервер будет предоставлять какую-то часть информации или ее всю
$_GET
Переменные, которые передаются текущему сценарию методом HTTP GET
$_POST
Переменные, которые передаются текущему сценарию методом HTTP POST
$_FILES
Элементы, подгруженные к текущему сценарию методом HTTP POST
$_COOKIE
Переменные, переданные текущему сценарию посредством HTTP cookies
$_SESSION
Переменные сессии, доступные текущему сценарию
$_REQUEST
Содержимое информации, переданной от браузера; по умолчанию $_GET, $_POST и $_COOKIE
$_ENV
Переменные, переданные текущему сценарию методом environment

В именах всех суперглобальных переменных (за исключением $GLOBALS) присутствует один знак подчеркивания и используются только заглавные буквы, поэтому, чтобы избежать путаницы, не следует присваивать своим переменным имена, оформленные в таком же стиле. Для иллюстрации порядка применения суперглобальных переменных рассмотрим часть той информации, которая может быть использована сайтами. Среди многой другой интересной информации, предоставляемой суперглобальными переменными, есть и URL‑адрес той страницы, с которой пользователь был перенаправлен на текущую веб-страницу. Эта информация может быть получена следующим образом:

$came_from = $_SERVER['HTTP_REFERRER'];

Как видите, ничего сложного. Если же пользователь зашел непосредственно на вашу страницу, к примеру набрав ее URL‑адрес непосредственно в браузере, переменной $came_from будет присвоена пустая строка.

Суперглобальные переменные и проблемы безопасности

Обратите внимание, что суперглобальные переменные часто используются злоумышленниками, пытающимися отыскать средства для атаки и вмешательства в работу вашего сайта. Они загружают в $_POST, $_GET или в другие суперглобальные переменные вредоносный код, например команды UNIX или MySQL, которые, если вы по незнанию к ним обратитесь, могут разрушить или отобразить незащищенные данные. Именно поэтому перед применением суперглобальных переменных их всегда следует подвергать предварительной обработке. Для этого можно воспользоваться PHP‑функцией htmlentities. Она занимается преобразованием всех символов в элементы HTML. Например, символы «меньше» и «больше» (< и >) превращаются в строки < и >, то же самое делается для перевода в безопасное состояние всех кавычек, обратных слешей и т. д. Поэтому более подходящий способ доступа к $_SERVER (и другим суперглобальным переменным) выглядит следующим образом:

$came_from = htmlentities($_SERVER['HTTP_REFERRER']);

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

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




Выражения и управление процессом выполнения программы в PHP

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

В этом уроке будет заложен фундамент практики программирования на PHP и рассмотрены основные способы управления процессом выполнения программы.

Содержание

Выражения

Начнем с базовой части любого языка программирования — выражения. Выражение представляет собой сочетание значений, переменных, операторов и функций, в результате вычисления которого выдается новое значение. Оно знакомо всем, кто когда-либо имел дело с обыкновенной школьной алгеброй:

y = 3({\mid 2x \mid} + 4)

что в PHP приобретает следующий вид:

$y = 3 * (abs(2*$x) + 4);

Возвращаемое значение (в данном случае y или $y) может быть числом, строкой или булевым (логическим) значением (названным так в честь Джорджа Буля, английского математика и философа XIX века). Первые два типа значений вам уже должны быть знакомы, поэтому я объясню, что такое третий тип.

TRUE или FALSE?

Элементарное булево значение может быть либо истинным — TRUE, либо ложным — FALSE. Например, выражение 20 > 9 (20 больше 9) является истинным (TRUE), а выражение 5 == 6 (5 равно 6) — ложным (FALSE). (Булевы, или логические, операции могут быть объединены путем использования таких операторов, как И, ИЛИ и исключающее ИЛИ, то есть AND, OR и XOR, которые будут рассмотрены в этой главе.)

Обратите внимание, что для имен TRUE и FALSE я использую буквы верхнего регистра. Это обусловлено тем, что в PHP они являются предопределенными константами. При желании можно также применять и их версии, составленные из букв нижнего регистра, поскольку они также являются предопределенными константами. Кстати, версия, в которой задействуются буквы нижнего регистра, более надежна, потому что PHP не допускает ее переопределения, а версия, использующая буквы верхнего регистра, может быть переопределена, и это нужно иметь в виду при импортировании чужого кода.

В примере показаны некоторые простые выражения: два, о которых уже упоминалось, плюс еще два выражения. Для каждой строки выводится буква от a до d, за которой следуют двоеточие и результат выражения (тег <br> используется в HTML для переноса и разбивает выходную информацию на четыре строки).

Теперь, когда HTML5 уже полностью вошел в обиход, и XHTML не планируется на замену HTML, больше уже не нужно использовать самозакрывающуюся форму <br /&gt; тега <br>, или любых пустых элементов (не имеющих закрывающих тегов), поскольку теперь символ / необязателен. Поэтому в данной книге мой выбор пал на использование более простого стиля. Если же где-нибудь сделать непустые теги HTML самозакрывающимися (например, <div />), в HTML5 они не сработают, потому что символ / будет проигнорирован, и их нужно будет, к примеру, заменить структурой <div> ... </div>. Но при работе с XHTML нужно по-прежнему пользоваться формой HTML-синтаксиса <br />.

<?php
	echo "a: [" . (20 > 9) . "]
"; echo "b: [" . (5 == 6) . "]
"; echo "c: [" . (1 == 0) . "]
"; echo "d: [" . (1 == 1) . "]
"; ?>

Этот код выведет следующую информацию:

<?php
	a: [1]
	b: []
	c: []
	d: [1]
?>

Обратите внимание, что результаты вычисления обоих выражений, a: и d:, являются истинными (TRUE), имеющими значение 1. А результаты вычисления выражений b: и c: ложны (FALSE) и вообще не показывают никакого значения, поскольку в PHP константа FALSE определена как NULL (ничто). Чтобы убедиться в этом, можно ввести код, приведенный в следующем примере:

<?php
	echo "a: [" . TRUE  . "]
"; echo "b: [" . FALSE . "]
"; ?>

Этот код выведет следующую информацию:

<?php // test2.php
echo "a: [" . TRUE . "]
"; echo "b: [" . FALSE . "]
"; ?>

Этот код выведет следующую информацию:

a: [1]
b: []

Кстати, в некоторых языках константа FALSE может быть определена как 0 или даже как –1, поэтому в каждом языке ее определение стоит проверить.

Литералы и переменные

Простейшей формой выражения является литерал, означающий нечто, вычисляющееся само в себя, например число 73 или строка Hello. Выражение может также быть просто переменной, которая вычисляется в присвоенное этой переменной значение. Обе формы относятся к типам выражений, поскольку они возвращают
значение.

В примере показаны три литерала и две переменные, все они возвращают значения, хотя и разных типов.

<?php
	$myname = "Brian";
	$myage = 37;
	echo "a: " . 73      . "
"; // Числовой литерал echo "b: " . "Hello" . "
"; // Строковый литерал echo "c: " . FALSE . "
"; // Литерал константы echo "d: " . $myname . "
"; // Строковая переменная echo "e: " . $myage . "
"; // Числовая переменная ?>

Как и ожидалось, в выходной информации вы увидите возвращаемое значение всех этих выражений, за исключением выражения c:, результат вычисления которого является FALSE и ничего не возвращает:

a: 73
b: Hello
c:
d: Brian
e: 37

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

В первой из них осуществляется присваивание результата выражения 366 - $day_number переменной $days_to_new_year, а во второй выводится приветственное сообщение, если выражение $days_to_new_year < 30 вычисляется как TRUE.

<?php
	$days_to_new_year = 366 - $day_number;	// Выражение
	if ($days_to_new_year < 30)
	{
		echo "Скоро Новый год!";			// Инструкция
	}
?>

Операторы

В PHP имеется множество мощных операторов, от арифметических, строковых и логических до операторов присваивания, сравнения и многих других операторов
(см. таблицу).

Таблица: Типы операторов PHP

Оператор
Описание
Пример
Арифметический
Элементарная математика
$a + $b
Для работы с массивом
Слияние массивов
$a + $b
Присваивания
Присваивание значений
$a = $b + 23
Поразрядный
Манипуляция битами в байте
12 ^ 9
Сравнения
Сравнение двух значений
$a < $b
Выполнения
Выполнение содержимого, заключенного в обратные кавычки
`ls -al`
Инкремента/декремента
Добавление или вычитание единицы
$a++
Логический
Выполнение булевых сравнений
$a and $b
Строковый
Объединение строк
$a . $b

 
Различные типы операторов воспринимают разное количество операндов.

  • Унарные операторы, такие как оператор инкремента ($a++) или изменения знака числа (-$a), воспринимают только один операнд.
  • Бинарные операторы, представленные большим количеством операторов PHP, включая операторы сложения, вычитания, умножения и деления, воспринимают два операнда.
  • Один трехкомпонентный оператор, имеющий форму x ? y : z. По сути, это состоящая из трех частей однострочная инструкция if, в которой осуществляется выбор между двумя выражениями, зависящий от результата вычисления третьего выражения.

Приоритетность операторов

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

1 + 2 + 3 - 4 + 5
2 - 4 + 5 + 3 + 1
5 + 2 - 4 + 1 + 3

Из примера видно, что, несмотря на перестановку чисел (и предшествующих им операторов), результат каждого выражения имеет значение 7, поскольку у операторов «плюс» и «минус» одинаковый уровень приоритета. Можно проделать то же самое с операторами умножения и деления, что показано чуть ниже.

1 * 2 * 3 / 4 * 5
2 / 4 * 5 * 3 * 1
5 * 2 / 4 * 1 * 3

В этом примере получаемое значение всегда равно 7,5. Но все меняется, когда в выражении присутствуют операторы с разными уровнями приоритета. Вот три выражения, в которых присутствуют операторы с разными уровнями приоритета:

1 + 2 * 3 - 4 * 5
2 - 4 * 5 * 3 + 1
5 + 2 - 4 + 1 * 3

Если бы не существовало приоритетности операторов, то в результате вычисления этих выражений получались бы числа 25, –29 и 12 соответственно. Но поскольку операторы умножения и деления имеют более высокий уровень приоритета по сравнению с операторами сложения и вычитания, вокруг частей выражения с их участием предполагается наличие скобок, и если их сделать видимыми, выражения будут выглядеть так, как в трёх выражениях, в которых отображены предполагаемые скобки

1 + (2 * 3) - (4 * 5)
2 - (4 * 5 * 3) + 1
5 + 2 - 4 + (1 * 3)

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

1 + (6) - (20)
2 - (60) + 1
5 + 2 - 4 + (3)

Окончательный результат вычисления этих выражений равен соответственно –13, –57 и 6 (что абсолютно отличается от результатов 25, –29 и 12, которые мы увидели бы при отсутствии приоритетности операторов). Разумеется, исходную приоритетность операторов можно отменить, расставив собственные скобки, и принудительно получить результаты, показанные в самом начале, которые были бы получены в отсутствие приоритетности операторов:

((1 + 2) * 3 - 4) * 5
(2 - 4) * 5 * 3 + 1
(5 + 2 - 4 + 1) * 3

Теперь, если скобки расставлены правильно, мы увидим значения 25, –29 и 12 соответственно. В таблице перечислены операторы в порядке их приоритетности от самого высокого до самого низкого уровня.

Таблица: Операторы PHP, расположенные по уровню их приоритетности (сверху вниз)

Оператор(ы)
Тип
()
Скобки
++ ––
Инкремент/декремент
!
Логический
* / %
Арифметические
+ -
Арифметические и строковые
<< >>
Побитовые
< <= > >= <>
Сравнения
== != === !==
Сравнения
&
Поразрядный (и ссылочный)
^
Поразрядный
|
Поразрядный
&&
Логический
||
Логический
? :
Трехкомпонентный
= += –= *= /= .= %= &= != ^= <<= >>=
Присваивания
and
Логический
xor
Логический
or
Логический

Взаимосвязанность операторов

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

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

Таблица: Взаимосвязанность операторов

Оператор
Описание
Взаимосвязанность
CLONE NEW
Создание нового объекта
Отсутствует
< <= >= == != === !== <>
Сравнение
Отсутствует
!
Логическое НЕ
Правая
~
Поразрядное НЕ
Правая
++ −−
Инкремент и декремент
Правая
(int)
Преобразование в целое число
Правая
(double) (float) (real)
Преобразование в число с плавающей точкой
Правая
(string)
Преобразование в строку
Правая
(array)
Преобразование в массив
Правая
(object)
Преобразование в объект
Правая
@
Подавление сообщения об ошибке
Правая
= += −= *= /=
Присваивание
Правая
.= %= &= |= ^= <<= >>=
Присваивание
Правая
+
Сложение и унарный плюс
Левая
Вычитание и отрицание
Левая
*
Умножение
Левая
/
Деление
Левая
%
Модуль
Левая
 
Конкатенация строк
Левая
<< >> & ^ |
Поразрядные операции
Левая
? :
Операция с тремя операндами
Левая
|| && and or xor
Логические операции
Левая
,
Разделение
Левая

Рассмотрим оператор присваивания, показанный в примере, где всем трем переменным присваивается значение 0.

<?php
$level = $score = $time = 0;
?>

Такое множественное присваивание возможно только в том случае, если сначала вычисляется самая правая часть выражения, а затем процесс продолжается справа налево.

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

Операторы отношения

Операторы отношения проверяют значения двух операндов и возвращают логический результат, равный либо TRUE, либо FALSE. Существует три типа операторов отношения: операторы равенства, сравнения и логические операторы.

Операторы равенства

С оператором равенства == (двойным знаком равенства) мы уже не раз встречались в этой книге. Его не следует путать с оператором присваивания = (одинарным знаком равенства). В примере ниже первый оператор присваивает значение, а второй проверяет его на равенство:

<?php
$month = "Март";
if ($month == "Март") echo "Весна наступила";
?>

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

К примеру, любые строки, составленные полностью из цифр, при сравнении с числами будут преобразованы в числа. В примере ниже переменные $a и $b являются двумя разными строками, и поэтому вряд ли стоило ожидать, что какая-то из инструкций if выведет результат.

<?php
$a = "1000";
$b = "+1000";
if ($a == $b) echo "1";
if ($a === $b) echo "2";
?>

Но если запустить этот пример, то он выведет число. Это означает, что результат вычисления первой инструкции if является TRUE. Причина в том, что обе строки сначала конвертируются в числа, и 1000 имеет такое же числовое значение, что и +1000.

В отличие от первой, во второй инструкции if используется оператор тождественности — тройной знак равенства, который удерживает PHP от автоматического преобразования типов. Поэтому переменные $a и $b сравниваются как строки и теперь считаются отличающимися друг от друга, и на экран ничего не выводится. Как и в случае с принудительным заданием уровня приоритетности операторов, если возникнут сомнения в том, будет ли PHP конвертировать типы операндов, для отмены такого поведения интерпретатора можно воспользоваться оператором тождественности.

Аналогично применению оператора равенства для определения равенства операндов можно проверить их на неравенство, используя оператор неравенства !=. В примере ниже операторы равенства и тождественности были заменены противоположными им операторами.

<?php
$a = "1000";
$b = "+1000";
if ($a != $b) echo "1";
if ($a !== $b) echo "2";
?>

Как, наверное, и ожидалось, первая инструкция if не выводит на экран число 1, потому что в коде ставится вопрос о неравенстве числовых значений переменных $a и $b. Вместо этого будет выведено число 2, поскольку вторая инструкция if ставит вопрос о нетождественности прежнего типа операндов переменных $a и $b, и ответом будет TRUE, потому что они не тождественны.

Операторы сравнения

Используя операторы сравнения, можно расширить круг проверок, не ограничивая его только равенством и неравенством. PHP предоставляет вам для этого операторы > (больше), < (меньше), >= (больше или равно) и <= (меньше или равно). Здесь показано использование этих операторов.

<?php
	$a = 2; $b = 3;
	if ($a > $b)  echo "$a больше $b
"; if ($a < $b) echo "$a меньше $b
"; if ($a >= $b) echo "$a больше или равно $b
"; if ($a <= $b) echo "$a меньше или равно $b
"; ?>

Этот пример, в котором переменная $a имеет значение 2, а переменная $b — значение 3, выведет на экран следующую информацию:

2 меньше 3
2 меньше или равно 3

Попробуйте самостоятельно запустить этот пример, меняя значения переменных $a и $b, чтобы увидеть результаты. Присвойте им одинаковые значения и посмотрите, что из этого получится.

Логические операторы

Логические операторы выдают истинные или ложные результаты. Всего имеется четыре таких оператора (см. таблицу "Логические операторы").

Таблица: Логические операторы

Логический оператор
Описание
AND
Возвращает истинное значение (TRUE), если оба операнда имеют истинные значения
OR
Возвращает истинное значение (TRUE), если любой из операндов имеет истинное значение
XOR
Возвращает истинное значение (TRUE), если один из двух операндов имеет истинное значение
NOT
Возвращает истинное значение (TRUE), если операнд имеет ложное значение, или ложное значение (FALSE), если он имеет истинное значение

Использование этих операторов показано в примере ниже. Обратите внимание, что PHP требует использовать вместо слова NOT символ !. Кроме того, операторы могут быть составлены из букв нижнего или верхнего регистра.

<?php
	$a = 1; $b = 0;
	echo ($a AND $b) . "
"; echo ($a or $b) . "
"; echo ($a XOR $b) . "
"; echo !$a . "
"; ?>

Этот пример выводит на экран NULL, 1, 1, NULL. Это значит, что только вторая и третья инструкции echo получают в результате вычисления значение TRUE. (Следует помнить, что NULL, или ничто, отображает значение FALSE.) Такой результат получается, потому что оператору AND, чтобы вернуть значение TRUE, нужно, чтобы оба операнда имели истинное значение, а четвертый оператор проводит над значением переменной $a операцию NOT, превращая его из TRUE (значения, равного единице) в FALSE. Если есть желание поэкспериментировать, запустите этот код, присваивая переменным $a и $b разные значения, выбранные из 1 и 0.

Занимаясь программированием, следует помнить, что у операторов AND и OR более низкий уровень приоритета, чем у других версий этих операторов — && и ||. Поэтому в сложных выражениях более безопасным будет, наверное, применение операторов && и ||.

Использование в инструкции if оператора OR может стать причиной непредвиденных проблем, поскольку второй операнд не будет вычисляться, если в результате вычисления первого операнда уже получено значение TRUE. В примере функция getnext никогда не будет вызвана, если переменная $finished имеет значение 1.

<?php
if ($finished == 1 OR getnext() == 1) exit;
?>

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

<?php
$gn = getnext();
if ($finished == 1 OR $gn == 1) exit;
?>

В этом случае код в функции getnext будет выполнен и возвращенное значение сохранится в переменной $gn еще до выполнения инструкции if. Другое решение заключается в том, чтобы обеспечить выполнение функции getnext за счет простой перестановки условий местами, поскольку тогда вызов функции будет появляться в выражении первым.

В таблице ниже показаны все допустимые варианты использования логических операторов. Следует заметить, что !TRUE является эквивалентом FALSE, а !FALSE — эквивалентом TRUE.

Таблица: Все логические выражения, допустимые в PHP

 
Входные данные
Операторы и результаты
 
 
a
b
AND
OR
XOR
 
 
TRUE
TRUE
TRUE
TRUE
FALSE
 
 
TRUE
FALSE
FALSE
TRUE
TRUE
 
 
FALSE
TRUE
FALSE
TRUE
TRUE
 
 
FALSE
FALSE
FALSE
FALSE
FALSE
 

Условия

Условия изменяют процесс выполнения программы. Они позволяют задавать конкретные вопросы и по-разному реагировать на полученные ответы. Условия играют важную роль при разработке динамических веб-страниц — основной цели использования PHP, поскольку облегчают создание разных вариантов выводимой при каждом просмотре веб-страницы информации. Существует три типа нециклических условных инструкций: if, switch и ?. Называя их нециклическими, я имел в виду, что после действий, инициированных инструкцией, процесс выполнения программы продолжается, а при использовании циклических условных инструкций (которые еще предстоит рассмотреть) код выполняется снова и снова до тех пор, пока не будет соблюдено определенное условие.

Инструкция if

Процесс выполнения программы можно представить себе как езду на машине по однополосной магистрали. Эта магистраль большей частью прямолинейна, но иногда встречаются различные дорожные знаки, задающие направление движения. Когда встречается инструкция if, можно представить, что машина подошла к знаку объезда, предписаниям которого необходимо следовать, когда определенные условия вычисляются как TRUE. При этом вы съезжаете с магистрали и следуете по объездному пути до тех пор, пока не вернетесь снова на магистраль и не продолжите движение по исходному маршруту. Или же, если условие не вычисляется как TRUE, вы игнорируете объезд и продолжаете ехать по магистрали как ни в чем не бывало (см. рисунок).

Процесс выполнения программы похож на движение по однополосной магистрали
Процесс выполнения программы похож на движение по однополосной магистрали

Содержимым условной инструкции if может быть любое допустимое PHP‑выражение, включая равенство, сравнение, проверку на нуль и NULL и даже значения, возвращаемые функциями (как встроенными, так и созданными самостоятельно). Действия, предпринимаемые при вычислении условия в TRUE, помещаются, как правило, в фигурные скобки { }. Но эти скобки можно опустить, если нужно выполнить всего одну инструкцию. Тем не менее, если всегда использовать фигурные скобки, можно избежать «охоты» на трудно отслеживаемые ошибки, возникающие, к примеру, когда к условной инструкции добавляется еще одна строка, но забывается о необходимости добавить фигурные скобки, из-за чего строка не вычисляется.

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

<?php
if ($bank_balance < 100)
{
$money
= 1000;
$bank_balance += $money;
}
?>

В этом примере проверяется, не стал ли баланс ниже $100 (или 100 единиц другой используемой вами валюты). Если баланс стал ниже этой суммы, вы платите сами себе $1000, а затем прибавляете их к балансу. (Хорошо бы так просто зарабатывать деньги!) Если баланс счета в банке равен $100 или превышает эту сумму, условные инструкции игнорируются и процесс выполнения программы переходит на следующую строку кода (которая здесь не показана). Одни разработчики предпочитают ставить первую фигурную скобку справа от условного выражения, а другие начинают с нее новую строку. В этой книге открывающая фигурная скобка располагается обычно на новой строке. Подойдет любой из этих вариантов, поскольку PHP позволяет оставлять на ваше усмотрение какие угодно свободные пространства (пробелы, символы новых строк и табуляции). Но код будет легче читаться и отлаживаться, если у каждого уровня условий будет свой отступ, сформированный с помощью символа табуляции.

Инструкция else

Бывают случаи, когда условие не вычисляется как TRUE, но вам не хочется сразу же продолжать выполнение основного кода программы, а вместо этого нужно сделать что-либо другое. Тогда пригодится инструкция else. С ее помощью на вашей магистрали можно организовать второй объезд, показанный на рисунке. Если при использовании конструкции if...else условие вычисляется как TRUE, то выполняется первая условная инструкция. Но если это условие вычисляется как FALSE, то выполняется вторая условная инструкция. Для выполнения должна быть выбрана одна из этих двух инструкций, но обе сразу они не будут выполнены ни при каких условиях, и обязательно будет выполнена хотя бы одна из них.

Использование конструкции if...else показано в примере:

<?php
if ($bank_balance < 100)
{
$money
= 1000;
$bank_balance += $money;
}
else
{
$savings
+= 50;
$bank_balance -= 50;
}
?>

Теперь у магистрали есть объезд if и объезд else
Теперь у магистрали есть объезд if и объезд else

Если в этом примере будет установлено, что в банке лежит $100 или более, то выполняется инструкция else, с помощью которой часть этих денег перемещается на ваш сберегательный счет. Точно так же, как и у if, если у инструкции else есть только одна условная инструкция, то фигурные скобки можно не ставить. (Хотя фигурные скобки рекомендуется использовать в любом случае. Во-первых, при их наличии проще разобраться в коде, а во-вторых, они облегчают последующее добавление инструкций к этому ветвлению.)

Инструкция elseif

Случается, что на основе последовательности условий нужно осуществить сразу несколько действий. Достичь желаемого результата можно, используя инструкцию elseif. Можно предположить, что она похожа на инструкцию else, за исключением того, что до кода условия вставляется еще одно условное выражение. Полноценная конструкция if...elseif...else показана в примере:

<?php
if ($bank_balance < 100)
{
$money
= 1000;
$bank_balance += $money;
}
elseif ($bank_balance > 200)
{
$savings
+= 100;
$bank_balance -= 100;
}
else
{
$savings
+= 50;
$bank_balance -= 50;
}
?>

В этом примере инструкция elseif была вставлена между инструкциями if и else. Она проверяет, не превышает ли баланс банковского счета сумму $200, и если превышает, принимается решение о том, что в этом месяце можно позволить себе положить на сберегательный счет $100. Это все можно представить в виде набора объездов в нескольких направлениях (cv рис.). Инструкция else завершает либо конструкцию if...else, либо конструкцию if...elseif...else. Если она не нужна, то финальную инструкцию else можно опустить, но ни одна из этих инструкций не должна стоять перед инструкцией elseif, точно так же, как ни одна инструкция elseif не должна стоять перед инструкцией if.

Магистраль с объездами if, elseif и else
Магистраль с объездами if, elseif и else

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

Инструкция switch

Инструкция switch применяется в тех случаях, когда у одной переменной или у результата вычисления выражения может быть несколько значений, каждое из которых должно вызывать особую функцию. Рассмотрим, например, управляемую кодом PHP систему меню, которая в соответствии с пожеланием пользователя передает отдельную строку коду основного меню. Предположим, что есть следующие варианты: Home, About, News, Login и Links, а переменная $page принимает одно из этих значений в соответствии с информацией, введенной пользователем.

Код реализации этого замысла с использованием конструкции if...elseif...
else может иметь вид, показанный в примере 4.22.

<?php
	if     ($page == "Home")  echo "Вы выбрали Home";
	elseif ($page == "About") echo "Вы выбрали About";
	elseif ($page == "News")  echo "Вы выбрали News";
	elseif ($page == "Login") echo "Вы выбрали Login";
	elseif ($page == "Links") echo "Вы выбрали Links";
?>

Код, в котором используется инструкция switch, показан в примере:

<?php
  switch ($page)
  {
      case "Home":  
          echo "Вы выбрали Home";
         break;
      case "About": 
          echo "Вы выбрали About";
         break;
      case "News":  
          echo "Вы выбрали News";
         break;
      case "Login": 
          echo "Вы выбрали Login";
         break;
      case "Links": 
          echo "Вы выбрали Links";
         break;
  }
?>

Как видите, переменная $page используется только один раз — в начале инструкции switch. После этого все соответствия проверяются командой case. Когда найдено соответствие, выполняется его условная инструкция. Разумеется, в настоящей программе в этом месте будет применяться код отображения или перехода на страницу, а не простое сообщение пользователю о том, что именно он выбрал.

В инструкциях switch внутри команд case фигурные скобки не используются. Вместо этого инструкции начинаются с двоеточия и заканчиваются командой break. Тем не менее весь перечень команд case в инструкции switch заключается в фигурные скобки.

Прекращение работы инструкции switch

Если нужно, чтобы инструкция switch прекратила свою работу из-за выполнения условия, используется команда break. Она предписывает PHP прекратить работу инструкции switch и перейти к выполнению следующей инструкции.

Если в примере, приведённом выше, не расставить команды break и результат вычисления команды case, проверяющей условие Home, получится TRUE, то будут выполнены все пять условных инструкций, следующих за командами case. Или же, если переменная $page имела значение News, то, начиная с этого места, будут выполнены все оставшиеся команды case. Это сделано преднамеренно для расширения возможностей программирования, но в большинстве случаев не следует забывать ставить команду break во всех местах, где набор условных инструкций, следующих за командами case, завершает свою работу. Надо сказать, что случайный пропуск команд break является весьма распространенной ошибкой.

Действие по умолчанию

Типичным требованием для инструкции switch является переход к действию по умолчанию, если не будет выполнено ни одно из условий, содержащихся в командах case. Например, к коду меню можно непосредственно перед закрывающей фигурной скобкой добавить код, показанный здесь:

default: echo "Нераспознанный выбор";
break;

Хотя здесь ставить команду break не требуется, поскольку default является заключительной внутренней инструкцией и процесс выполнения программы автоматически продолжится после закрывающей фигурной скобки, но если вы решите поставить инструкцию default выше этого места, ей определенно понадобится команда break, для того чтобы процесс выполнения программы не затронул все стоящие ниже условные инструкции. Лучше перестраховаться и в конце этой инструкции всегда ставить команду break.

Альтернативный синтаксис

Открывающую фигурную скобку инструкции switch можно заменить двоеточием, а закрывающую — командой endswitch (см. пример ниже). Такой вариант используется довольно редко, и здесь он упоминается на тот случай, если придется столкнуться с ним в коде, созданном кем-нибудь другим.

<?php
	switch ($page):
		case "Home":
			echo "Вы выбрали Home";
			break;
		// и т.д. ...
		case "Links":
			echo "Вы выбрали Links";
			break;
	endswitch;
?>

Оператор ?

Использование трехкомпонентного оператора ? позволяет избежать многословности инструкций if и else. Необычность этого оператора заключается в том, что он использует не два, как большинство других операторов, а три операнда. У нас уже состоялось краткое знакомство с этим оператором при выяснении разницы между print и echo, где он приводился в качестве примера оператора, который хорошо работает с print, но не работает с echo. Оператору ? передаются выражение, которое он должен вычислить, и два выполняемых оператора: один для выполнения, когда результат вычисления выражения TRUE, а другой — когда FALSE.

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

<?php
echo $fuel <= 1 ? "Требуется дозаправка" : "Топлива еще достаточно";
?>

Если топлива остается всего 1 галлон или меньше (иными словами, переменная $fuel имеет значение, равное единице или меньше ее), то этот оператор возвращает предыдущей команде echo строку «Требуется дозаправка». В противном случае он возвращает строку «Топлива еще достаточно». Значение, возвращаемое оператором ?, можно также присвоить какой-нибудь переменной:

<?php
$enough = $fuel <= 1 ? FALSE : TRUE;
?>

В этом примере переменной $enough будет присвоено значение TRUE только в том случае, если в баке более 1 галлона топлива, в противном случае ей будет присвоено значение FALSE. Если вы считаете синтаксис оператора ? слишком запутанным, то можете вместо него воспользоваться инструкцией if, но о нем все равно нужно знать, поскольку он может встретиться в программном коде, созданном другим программистом. Чтение кода, в котором используется этот оператор, может быть сильно затруднено из-за частого применения в нескольких местах одной и той же переменной. Например, весьма популярен код такого вида:

$saved = $saved >= $new ? $saved : $new;

Понять, что он делает, можно только после тщательного разбора:

$saved =                  // Присваивание значения переменной $saved
        $saved >= $new    // Сравнение $saved и $new
    ?                     // Если сравнение выдает истинный результат ...
        $saved            // ... ей присваивается текущее значение $saved
    :                     // Если сравнение выдает ложный результат ...
        $new;             // ... ей присваивается значение переменной $new

Это весьма компактный способ отслеживания самого большого значения, которое может встретиться в процессе выполнения программы. Самое большое значение содержится в переменной $saved и при поступлении нового значения сравнивается со значением переменной $new. Программисты, освоившие оператор ?, считают, что для таких коротких сравнений его удобнее применять, чем инструкции if. Если этот оператор не используется для создания компактного кода, то он обычно применяется для принятия решений, умещающихся на одной строке, например для проверки того, установлено ли значение переменной, перед передачей ее функции.

Организация циклов

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

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

Представление цикла как части программы магистральной разметки
Представление цикла как части программы магистральной разметки

Циклы while

Превратим автомобильную панель приборов из предыдущего примера в цикл, постоянно проверяющий уровень топлива при езде на машине, в котором используется инструкция цикла while:

<?php
	 $fuel = 10;
	 while ($fuel > 1)
	 {
		// Продолжение поездки...
		echo "Топлива еще достаточно";
	 }
?>

Вообще-то, вы можете предпочесть выводу текста горящий зеленый сигнал, но суть в том, что любая разновидность позитивной индикации об уровне топлива помещается в цикл while. Кстати, учтите, что если вы запустите этот пример на выполнение, то он будет постоянно выводить строку, до тех пор пока вы не остановите работу браузера. Здесь, как и в случае с инструкциями if, для хранения инструкций внутри цикла while используются фигурные скобки, если только в этом цикле не задействована лишь одна инструкция.

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

<?php
$count = 1;
while ($count <= 12)
{
	echo "Число $count, умноженное на 12, равно " . $count * 12 . "
"; ++$count; } ?>

В этом примере переменной $count присваивается начальное значение 1, а затем запускается цикл while, в котором используется выражение сравнения $count <= 12. Цикл будет выполняться до тех пор, пока значение переменной не станет больше 12.

Данный код выведет следующий текст:

Число 1, умноженное на 12, равно 12
Число 2, умноженное на 12, равно 24
Число 3, умноженное на 12, равно 36

и т.д.

Внутри цикла осуществляется вывод строки, а также значения переменной $count, умноженного на 12. Чтобы упорядочить вывод, после всего этого использован тег <br />, вызывающий переход на новую строку. Затем перед закрывающей фигурной скобкой, предписывающей PHP вернуться к началу цикла, значение переменной $count увеличивается на единицу.

Теперь значение переменной $count опять проверяется, чтобы узнать, не превышает ли оно число 12. Оно не превышает этого числа, но теперь оно равно 2, и после 11 последующих прохождений цикла оно станет равно 13. Когда это произойдет, код, находящийся внутри цикла while, будет пропущен и станет выполняться код, следующий за циклом, в данном случае это будет завершение программы. При отсутствии оператора ++$count (вместо которого с таким же успехом может быть применен оператор $count++) этот цикл будет похож на первый, показанный в этом разделе. Он никогда не закончится и будет снова и снова выводить один и тот же результат 1 ⋅ 12.

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

<?php
$count = 0;
while (++$count <= 12)
echo "Число $count, умноженное на 12, равно " . $count * 12 . "
"; ?>

В этом примере оператор ++$count был удален из тела цикла while и помещен непосредственно в выражение условия цикла. Теперь PHP вычисляет значение переменной $count в начале каждого прохода цикла (итерации) и, заметив, что перед именем переменной стоит оператор инкремента, сначала увеличивает значение переменной на 1 и только потом сравнивает его с числом 12. Следовательно, теперь переменной $count присваивается начальное значение 0, а не 1, поскольку это значение увеличивается сразу же, как только происходит вход в цикл. Если оставить начальное значение, равное 1, то будут выведены результаты для чисел между 2 и 12.

Циклы do...while

Цикл do...while представляет собой небольшую модификацию цикла while, используемую в том случае, когда нужно, чтобы блок кода был исполнен хотя бы один раз, а условие проверялось только после этого. В примере показана модифицированная версия таблицы умножения на 12, в которой использован этот цикл:

<?php
$count = 1;
do
	echo "Число $count, умноженное на 12, равно " . $count * 12 . "
"; while (++$count <= 12); ?>

Заметьте, что теперь мы вернулись к присваиванию переменной $count начального значения 1 (а не 0), потому что код выполняется сразу же, без увеличения значения переменной на 1. Во всем остальном этот код очень похож на показанный в предыдущем примере. Разумеется, если внутри цикла do...while находится несколько инструкций, то не следует забывать ставить вокруг них фигурные скобки, как показано:

<?php
$count = 1;
do {
	echo "Число $count, умноженное на 12, равно " . $count * 12;
	echo "
"; } while (++$count <= 12); ?>

Циклы for

Цикл for, являющийся последней разновидностью инструкций цикла, к тому же еще и самый мощный из них, поскольку в нем сочетаются возможности установки значения переменных при входе в цикл, проверки соблюдения условия при каждом проходе цикла (итерации) и модификации значений переменных после каждой итерации. В примере показнаа возможность вывода таблицы умножения с использованием цикла for.

<?php
for ($count = 1 ; $count <= 12 ; ++$count)
echo "Число $count, умноженное на 12, равно " . $count * 12 . "
"; ?>

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

  • выражение инициализации;
  • выражение условия;
  • выражение модификации.

Эти три выражения отделяются друг от друга точкой с запятой: for (выражение1 ; выражение2 ; выражение3). В начале первой итерации выполняется выражение инициализации. В нашем коде таблицы умножения переменная $count инициализируется значением 1. Затем при каждой итерации проверяется выражение условия (в данном случае $count <= 12), и выход из цикла осуществляется только в том случае, если результат вычисления условия будет TRUE. И наконец, в завершение каждой итерации выполняется выражение модификации. В случае с таблицей умножения значение переменной $count увеличивается на 1.

Эта структура в явном виде исключает любые требования по размещению управляющих элементов цикла в его собственном теле, освобождая его для инструкций, требующих циклического выполнения. Если в теле цикла for содержится несколько инструкций, не забудьте воспользоваться фигурными скобками:
Пример 4.34. Цикл for из примера 4.33 с добавлением фигурных скобок

<?php
for ($count = 1 ; $count <= 12 ; ++$count)
{
echo "Число $count, умноженное на 12, равно " . $count * 12;
echo "
"; } ?>

Сравним условия, при которых следует использовать циклы for, с условиями, при которых нужно применять циклы while. Цикл for явно создавался под отдельное значение, изменяющееся на постоянную величину. Обычно мы имеем дело с увеличивающимся значением — это похоже на то, как если бы вам был передан перечень того, что выбрал пользователь, и от вас требуется обработать каждый его выбор по очереди. Но переменную можно видоизменять по вашему усмотрению. Более сложная форма инструкции for позволяет даже осуществлять со всеми тремя параметрами сразу несколько операций:

for ($i = 1, $j = 1 ; $i + $j < 10 ; $i++ , $j++)
{
// ...
}

Но новичкам использовать такую сложную форму не рекомендуется. Здесь главное — отличать запятые от точки с запятой. Все три параметра должны быть отделены друг от друга точкой с запятой. Несколько операторов внутри каждого параметра должны быть отделены друг от друга запятыми. Первый и третий параметры в предыдущем примере содержат по два оператора:

$i = 1, $j = 1   // Инициализация переменных $i и $j
$i + $j < 10     // Условие окончания работы цикла
$i++ , $j++     // Модификация $i и $j в конце каждой итерации

Главное, что следует уяснить из этого примера, — три секции параметров должны разделяться точкой с запятой, а не запятыми (которые могут использоваться только для разделения операторов внутри каждой секции параметров). Тогда при каких условиях следует отдавать предпочтение инструкциям while перед инструкциями for? Когда ваше условие не зависит от простого изменения переменной на постоянной основе. Например, инструкция while применяется в том случае, если нужно проверить, не введено ли какое-то определенное значение или не возникла ли какая-то конкретная ошибка, и завершить цикл сразу же, как только это произойдет.

Прекращение работы цикла

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

<?php
$fp = fopen("text.txt", 'wb');
for ($j = 0 ; $j < 100 ; ++$j)
{
	$written = fwrite($fp, "data");
	if ($written == FALSE) break;
}
fclose($fp);
?>

Это наиболее сложный из всех ранее приведенных фрагментов кода, но вы уже готовы к его пониманию. Команды обработки файлов будут рассмотрены в одной из следующих глав, а сейчас нужно лишь знать, что в первой строке кода открывается файл text.txt для записи в двоичном режиме, а затем переменной $fp возвращается указатель на него, который в дальнейшем используется для ссылки на этот открытый файл. Затем осуществляется 100 проходов цикла (от 0 до 99), записывающих строку data в файл. После каждой записи функция fwrite присваивает переменной $written значение, представляющее собой количество успешно записанных символов. Но если происходит ошибка, то функция fwrite присваивает этой переменной значение FALSE.

Поведение функции fwrite облегчает коду проверку переменной $written на наличие значения FALSE, и если она имеет такое значение, код прекращает работу цикла и передает управление инструкции, закрывающей файл.

При желании улучшить код можно упростить строку:

if ($written == FALSE) break;

за счет использования оператора NOT:

if (!$written) break;

Фактически пара инструкций, находящихся внутри цикла, может быть сокращена до одной:

if (!fwrite($fp, "data")) break;

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

break 2;

Инструкция continue

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

Этот прием может пригодиться в тех случаях, когда известно, что нет смысла продолжать выполнение текущего цикла и нужно сберечь процессорное время или избежать ошибки путем перехода сразу к следующей итерации цикла. В примере ниже инструкция continue используется для того, чтобы избежать ошибки деления на нуль за счет ее вызова в тот момент, когда переменная $j имеет значение 0.

<?php
$j = 10;
while ($j > –10)
{
	$j--;
	if ($j == 0) continue;
	echo (10 / $j) . "
"; } ?>

Для всех значений переменной $j в диапазоне чисел между 10 и –10, за исключением 0, отображается результат деления числа 10 на значение переменной $j. Но для конкретного случая, когда значение $j равно 0, вызывается инструкция continue и дальнейшее выполнение итерации сразу же пропускается с переходом к следующей итерации цикла.

Неявное и явное преобразование типов

PHP является языком со слабой типизацией, который позволяет объявлять переменную и ее тип путем простого использования этой переменной. При необходимости он также осуществляет автоматическое преобразование одного типа в другой. Этот процесс называется неявным преобразованием типов. Однако могут возникнуть ситуации, когда присущее PHP неявное преобразование типов станет совсем нежелательным действием. Рассматривая пример ниже, обратите внимание на то, что входные данные для операции деления являются целыми числами. По умолчанию PHP осуществляет преобразование выходных данных к числу с плавающей точкой, чтобы получалось наиболее точное значение — 4,66 и 6 в периоде.

<?php
$a = 56;
$b = 12;
$c = $a / $b;
echo $c;
?>

Но что делать, если вместо этого нужно получить значение переменной $c в виде целого числа? Этого можно добиться разными способами, одним из которых является принудительное преобразование результата $a/$b в целое число путем использования оператора преобразования (int):

$c = (int) ($a / $b);

Такой способ называется явным преобразованием типов. Обратите внимание, что для обеспечения преобразования в целое число значения всего выражения это выражение помещено в круглые скобки. В противном случае преобразованию подверглось бы только значение переменной $a, что не имело бы никакого смысла, поскольку деление на значение переменной $b все равно вернуло бы результат в виде числа с плавающей точкой. Можно провести явное преобразование значений в те типы, которые показаны в таблице но обычно его можно избежать, используя преобразование за счет вызова одной из встроенных функций PHP. Например, для получения целочисленного значения можно использовать функцию intval. Этот раздел, как и многие другие в данной книге, предназначен в основном для того, чтобы помочь разобраться с чужим кодом, который может вам встретиться.

Таблица: Типы преобразований, доступных в PHP

Тип преобразования
Описание
(int) (integer)
Преобразование в целое число путем отбрасывания десятичной части
(bool) (boolean)
Преобразование в логическое значение
(float) (double) (real)
Преобразование в число с плавающей точкой
(string)
Преобразование в строку
(array)
Преобразование в массив
(object)
Преобразование в объект

Динамическое связывание в PHP

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

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

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

Второй модуль неплохо было бы создать для регистрации пользователей, предшествующей их допуску к основной части вашего сайта. Затем можно создать модуль вывода сообщений, в котором пользователи могли бы оставлять свои комментарии, модуль, содержащий ссылки и полезную информацию, еще один модуль, позволяющий загружать на сайт фотографии, и т.д. Как только будет создано средство для отслеживания действий пользователя на вашем сайте, использующее объекты cookie или переменные сессии (оба этих средства будут более подробно рассмотрены в следующих главах), можно разделить сайт на удобные секции PHP‑кода, каждая из которых будет независима от других.

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

Динамическое связывание в действии

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

Платформа WordPress, предназначенная для ведения блогов, написана на PHP
Платформа WordPress, предназначенная для ведения блогов, написана на PHP

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

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




Функции и объекты PHP

Содержание




Массивы в PHP

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

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




Простой запрос Ajax с помощью jQuery и PHP

Когда я начинал использовать [[JavaScript]] и [[JQuery]], то был разочарован отсутствием простых примеров использования [[Ajax]] в [[jQuery]].

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

Пример запроса GET, отправленного с помощью jQuery и Ajax:

$.ajax({
    type: "GET",
    url: 'test.php',
    success: function(data){
        alert(data);
    }
});

В примере кода передаются три параметра:

  1. type: тип HTTP запроса. В этом примере я отправляю запрос GET. Если вы хотите отправить запрос POST, измените “GET” на “POST”.
  2. url: адрес,на который вы хотите отправить Ajax запрос. В нашем случае это страница “test.php”. Помните, что URL-адрес указывается относительно текущей страницы.
  3. success: функция, которая вызывается, если запрос был успешным. Она принимает параметр data, который будет содержать вывод страницы test.php. То есть, если test.php выводит строку “OK”, то параметр data будет содержать строку “OK”.

Поэкспериментируйте с приведённым выше кодом. Например, замените“GET” на “POST” и измените URL-адрес. Можно использовать инструменты разработчика, встроенные в Firefox / Chrome для отладки Ajax- запросов. Они доступны на вкладке «Сеть». Инструменты разработчика позволяют визуализировать запрос.

Что если мы захотим добавить параметры запроса GET к Ajax-запросу?

$.ajax({
    type: "GET",
    url: 'test.php',
    data: {name:'Wayne'},
    success: function(data){
        alert(data);
    }
});

Я добавил новый параметр data. Это объект JavaScript, содержащий данные, которые передаем в запросе. Поскольку мы отправляем запрос GET, эти параметры будут автоматически добавлены к строке запроса: test.php?name=Wayne

Пример добавления нескольких параметров GET:

$.ajax({
    type: "GET",
    url: 'test.php',
    data: {name: 'Wayne', age: 27, country: 'Ireland'},
    success: function(data){
        alert(data);
    }
});

Приведенный выше код отправит запрос GET к test.php?name=Wayne&age=27&country=Ireland

Поэкспериментируйте с кодом, чтобы разобраться в нём. Попробуйте добавлять и удалять параметры, чтобы понять, как отправлять данные с помощью jQuery и Ajax.

А если мы хотим отправить запрос POST к файлу submission.php?

$.ajax({
    type: "POST",
    url: 'submission.php',
    data: {name:'Wayne', age: 27},
    success: function(data){
        alert(data);
    }
});

Я изменил тип метода (с GET на POST) и URL-адрес (на submission.php). В этом примере параметры name и age будут отправлены как переменные POST. Это означает, что на странице submission.php их можно получить с помощью следующего кода:

$name = $_POST['name'];
$age = $_POST['age'];

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

$name = $_GET['name'];
$age = $_GET['age'];

Последней частью паззла является функция success(). Она вызывается, если Ajax-запрос завершается успешно. В примере, приведенном выше, я вывожу результат в сообщении. Но в большинстве случаев вы будете использовать эту функцию для отображения уведомлений на странице. Например, если пользователь отправляет форму с помощью Ajax, тогда эта функция применяется для проверки ответа. А также для вывода сообщения о том, что данные формы успешно отправлены на сервер.

Надеюсь, эта статья помогла вам разобраться с основами Ajax-запросов и теперь задачи практикума, где надо вводить исходные данные Вы легко решите!




POST, GET: чем отличаются запросы друг от друга

Общего между ними то что они работают одинаково. Разницы между ними технически никакой. А вот идеологические различия есть.

Я расскажу о них в контексте PHP. Прошу заметить что протокол [[HTTP]] к [[PHP]] имеет косвенное отношение потому что он создавался для обмена html страницам а PHP просто расширяет возможности и того и другого.

GET запрос используется чтобы получить данные, а POST чтобы отправить. (Напоминаю что технически они работают одинаково).

Поэтому в контексте PHP опираясь на эту идеологию сделали следующим образом:

  1. При каждом запуске PHP по умолчанию создаются суперглобальные массивы ($_GET, $_POST).
  2. Если в строке запроса есть вопросительный знак(?). То все что после него считается параметрами GET запроса они представлены в формате 'ключ'='значение' и в качестве разделителя используется знак амперсанда (&)
    Пример:
    GET /index.php?name=Андрей&surname=Галкин
    это строка запроса, тут 2 параметра. эти параметры попадут в массив $_GET.
  3. $_POST заполняется другим способом. содержимое этого массива заполняется из «заголовков запроса». То есть из места, скрытого от глаз в явном виде. Всю рутину по созданию таких заголовков берет на себя браузер. Хотя иногда и что-то редактируется в заголовках в ручную.

Чаще всего пост запрос используется в формах (для отправки данных).

Например у нас есть форма для входа 2 поля логин и пароль.

Представим что мы используем GET метод. Тогда при отправке формы мы перейдем на следующий адрес /login.php?login=Андрей&password=123 согласитесь что так передавать такую информацию совсем не безопасно. Любой может открыть ваш браузер и начиная вводить адрес сайта он из истории может увидеть ваши пароли и логины.

А вот если бы мы указали методом POST то мы бы получили следующий запрос:
POST /login.php (login=Андрей&password=123) то что в скобочках было бы скрыто и никак не сохранено в браузере.

Теперь другая ситуация например форма поиска. Мы вводим текст и получаем страницу с результатами. Вот тут уместнее GET форма. потому что нам было бы удобно сразу иметь ссылку на результат поиска, то есть добавить в строку запроса можно выразится «Публичные параметры», которыми можно поделиться. И как результат в строке браузера будет конкретная ссылка на текущую страницу. Мы можем ее скопировать, и разместить где-нибудь, или например скинуть другу. И получить при переходе одну и ту же страницу. А не просить других людей зайти на сайт и в поиск вбить определенную фразу чтобы получить необходимую страницу.

В общем, подводя итог:

GET — это чтобы получить определенную страницу в определенном виде ( сортировка, текущая страница в блоге, строка поиска и т.п. ).
POST — для оправки данных которые не влияют на отображение страницы, в том плане что эти данные влияют только на результат выполнения скрипта (логины, пароли, номера кредиток, сообщения и т.п.).

И еще одна хорошая новость их можно комбинировать, например, POST /index.php?page=login (login=Андрей&password=123) Думаю я уже достаточно объяснил что из этого получится и какие параметры в какой массив попадут.




Большое руководство по созданию структуры и планированию контента для веб-сайта

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

Пример структуры веб-сайта
Пример структуры веб-сайта

Пример структуры веб-сайта

Какие разделы включить? Что по поводу контента? Мы серьезно все продумали, потратили более месяца на исследования и собрали в этом гиде весь наш 18-летний опыт по созданию сайтов. Дочитав эту статью, вы обретете исчерпывающее представление о том, почему именно так должен быть структурирован сайт компании или продукта, мы также немного коснемся фундаментальных принципов SEO и планирования контента.

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

Начало

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

Создание последовательной структуры означает создание прочной основы для вашего успешного присутствия в сети. Вдумчивое планирование и реализация этого этапа способствуют достижению всех последующих целей максимально эффективно.

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

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

Звучит многообещающе? Тогда начинаем!

Основной совет

Навигация и футер

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

Если у вас есть сомнения по поводу того, ссылки на какие внутренние страницы включить в футер своего сайта — это хорошо! Потому что ниже по тексту мы уделили этому отдельный раздел.

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

Максимизируйте CTR

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

Поэтому, разместив наиболее ценную информацию и элементы призыва к действию CTA (call-to-action) в эффективном первом поле экрана, вы увеличите показатель кликабельности (CTR — click-through rate) и завладеете вниманием посетителя. Речь идет буквально о 3-4 секундах, за которые посетитель сканирует экран и, не найдя быстро нужной информации, чаще всего сразу покидает страницу.

Призыв к действию (CTA)

Следующий шаг — убедитесь, что элементы call-to-action (CTA), призывающие к конкретному целевому действию, расположены в нужном месте. Стандартным способом размещения CTA является добавление соответствующей кнопки, но также распространены и другие формы — картинки, видео, ссылки.

Исходя из практики, главное правило для CTA — элемент должен выделяться. Чем лучше проработаны эти элементы, тем больше кликов пользователей вы получите.

Политика конфиденциальности GDPR

Если ваша целевая аудитория — это клиенты из стран ЕС, то обработка данных пользователей должна соответствовать правилам обработки персональных данных GDPR (General Data Protection Regulation), принятых в Европе.

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

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

Структура

Мы это сделали за вас, но если вы все-таки решите самостоятельно провести исследование по качественно сделанным сайтам, то обнаружите, что их структуры похожи. Это отточенные временем модели, которые вряд ли сильно изменятся в ближайшее будущее. Естественно, руководство, приведенное ниже, не является золотым стандартом. Это база, основная отправная точка. Начиная с нее, сфокусируйтесь на своей сфере бизнеса, изучите сайты и структуры конкурентов, чтобы достичь наилучших результатов.

Вот эти страницы, из которых состоит грамотно сбалансированная структура сайта:

  • Главная
  • О нас
  • Продукты / Услуги
  • FAQ
  • Вакансии
  • Блог
  • Контакты
  • Ошибка 404
  • Правовая информация

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

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

  • Главная
  • О нас
  • Продукты / Услуги
  • Контакты
  • Правовая информация

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

Цель каждой страницы, включенной в структуру вашего сайта — преобразовывать посетителей в клиентов. Страницы образуют последовательности, постепенно подогревая интерес перемещающихся по ним посетителей, чтобы те в итоге очутились на странице вашего продукта или услуги. Все остальное является частью user flow (пользовательского потока).

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

Главная страница

Для чего создавать: зацепите внимание, произведите первое впечатление, оптимизируйте навигацию.

Содержание:

  • Hero image / Основной визуальный посыл
  • Продукт / Услуги
  • Ключевые преимущества
  • О нас
  • Вакансии
  • Отзывы (тематические исследования, рекомендации)
  • CTA

Пример главной страницы — iea.org
Пример главной страницы — iea.org

Может показаться, что главная страница является самой важной частью вашего сайта. Однако последние исследования показывают, что посетители проводят на ней не так уж и много времени. Среднее время сеанса составляет около 2 минут 17 секунд, при этом посещение главной страницы занимает около 7 секунд. Причина в том, что люди часто ищут сразу что-то более конкретное.

Следовательно, ваша главная страница — это панель управления, призванная помочь пользователям попасть туда, куда им нужно настолько быстро, насколько это возможно. Это главный хаб, где собираются и направляются потоки входящего трафика.

“Главная страница — это как лобби отеля. Хотя это и важная часть отеля, но это не то место, где ваши гости хотели бы остановиться. Они хотят попасть в свой номер.”

Hero image

Hero-изображение — это первый визуальный эффект, который видит пользователь, попадая на сайт. Изображения, как правило, быстрее доносят информацию и создают более вовлекающий эмоциональный отклик. Поэтому делайте hero image чем-то уникальным, броским и, самое главное, тесно связанным с вашим брендом.

Чтобы лучше понять какой посыл должно нести это изображение, ознакомьтесь с концепцией JTBD (jobs-to-be-done), краткий смысл которой состоит в том, что у клиента на данный момент есть конкретная задача / проблема, которую надо выполнить, и он ищет лучшее решение (продукт), который поможет ему в этом. Ваша же цель — дать ему понять, что ваш продукт решает эту задачу.

Ваши продукты / услуги

Чем скорее вы покажете людям то, что вы предлагаете, тем лучше. Если ваша линейка продуктов ограничена лишь несколькими наименованиями, подумайте о том, чтобы показать их все на главной странице. Если продуктов много, то необходимо создание каталога и классификации с краткими описаниями для каждой категории. Добавьте визуальные объяснения и категорию продукта.

Обозначьте характеристики и преимущества продукта

Как сказал Саймон Синек в своей знаменитой речи — люди покупают не то, ЧТО вы делаете, они покупают то, ПОЧЕМУ вы делаете это.

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

Социальное влияние

Люди склонны прислушиваться и доверять своему окружению. Еще один прекрасный способ быстро внедрить и распространить информацию — это добавить отзывы о вашей компании или продуктах. Сосредоточьтесь на вашей целевой аудитории и добавьте соответствующие отзывы. Чем более известен и публичен автор отзыва, тем лучше. Не беспокойтесь, если вы еще не засветились на TechCrunch или Forbes; ваши посетители должны быстро установить положительный эмоциональный контакт с рецензентами, вот что важно на данный момент.

О нас

Зачем создавать: расскажите историю своего бренда или компании, опишите миссию, представьте вашу команду и любую другую ценную информацию, которая поможет вашим конверсиям.

Содержание:

  • История / timeline
  • Цели и миссия компании
  • Отзывы
  • Команда
  • Партнеры
  • Видео
  • Статистика
  • Интересные факты

Пример страницы О компании — hines.com/about
Пример страницы О компании — hines.com/about

Противоречиво, но главная страница существует не для того, чтобы проводить на ней много времени, аналогично и с разделом “О нас”. На самом деле он не совсем о вашей компании.

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

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

Прежде всего, определите вашу целевую аудиторию. Кто главный адресат информации? Техническая персона? Человек, принимающий решения или нет? Ваш рассказ и форма, в которой вы его преподносите, должен коррелировать с ценностями и задачами таргет-группы, мотивировать людей к действию.

История компании

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

Ваши основные принципы

Расскажите посетителям о миссии и целях вашей компании. Пусть это будет живая история, а не сухой список пунктов. В вашем повествовании акцентируйте внимание на потребительской ценности вашего продукта. Докажите, что ваша главная цель — сделать жизнь каждого клиента лучше.

И снова отзывы

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

Вы также можете добавить агрегированные отзывы клиентов, достижения, бейджи и награды. Рассмотрите возможность размещения профиля вашей компании на различных информационных площадках (online listings). Это позволит получить два основных преимущества. Первое — качественные бэклинки на ваш сайт крайне привлекательны для SEO. Второе — если вы вкладываете ресурсы в сбор отзывов клиентов на таких платформах, то они, как правило, включают вас в рассылки и дают бейджи. А это — более широкий охват аудитории и повышение узнаваемости бренда.

Люди за кулисами

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

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

При добавлении визуального контента на страницу «О нас» сосредоточьтесь на реальных снимках, держитесь подальше от стоковых изображений.

Партнеры

Почти то же самое, что и выше, относится к публикации ваших деловых партнеров.
Если это имеет отношение к делу — добавьте эту информацию.

Запишите видео

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

Статистика и интересные факты

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

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

Продукты / услуги

Зачем создавать: продемонстрируйте свои продукты детально и обрисуйте в общих чертах их ценности.

Содержание:

  • Изображения
  • Описание
  • Особенности и преимущества
  • Цены
  • Отзывы / рекомендации
  • Контактная форма
  • FAQ

Пример страницы Услуги/Продукты — stripe.com/payments
Пример страницы Услуги/Продукты — stripe.com/payments

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

Вместе или раздельно

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

Визуальный язык

Изображения продуктов имеют огромное значение и лучше всего выполняют свои функции контекстные образы.

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

Описание продукта

Скомбинируйте изображение с детальным описанием продукта. Само по себе — это уже отдельная наука, поэтому не будем углубляться в это. Сфокусируйтесь на своей целевой аудитории. И помните о подходе JTBD, мы ранее уже касались этой темы.

Особенности и преимущества (ценность)

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

Цены

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

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

Наличие отдельной ценовой страницы (продукты / услуги) хорошо для вашего SEO: больше страниц в вашем индексе, больше ключевых слов для ранжирования в содержании страницы. Еще одним преимуществом отдельного расположения цен является возможность точной настройки пути вашего клиента, особенно в воронках B2B. Но общее правило — лучше сразу экономить ресурсы и указывать цены на своей домашней странице.

Если вы хотите заручиться доверием ваших будущих клиентов, то не забудьте проинформировать их о безопасной обработке платежей, о ваших правилах возврата, отмены и обмена. Другим хорошим способом налаживания доверительных отношений является наличие пробного периода (trial).

Актуальность обратной связи

Мы уже коснулись важности отзывов и рекомендаций. Добавление отзывов клиентов по конкретным продуктам — отличный способ показать ценность продукта для вашей целевой аудитории.

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

Будьте на связи

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

Как только вы наберете обороты, подумайте о внедрении комплексных платформ управления клиентами, таких как Intercom или HelpScout, с их функциями для чата и интерактивной средой связи с клиентами.

Подготовьте ответы на вопросы заранее

Еще один способ улучшить взаимодействие с пользователем на странице вашего продукта или услуг — включить раздел FAQ. Сосредоточьтесь на часто задаваемых вопросах в ваших входящих сообщениях и на семантике SEO.

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

Навигация

Страница продукта может служить Pillar страницей — быть хабом, аккумулирующим ценный органический трафик. И уже к ней линкуются релевантные кластерные страницы (Cluster pages). Помимо улучшения SEO, использование модели Pillar-Cluster значительно упорядочивает пользовательский поток на вашем сайте.

FAQ

Для чего создавать: ответить на типичные вопросы клиентов, не обращаясь к ним напрямую.
Содержание:

  • Вопросы и ответы
  • Поиск
  • Живой чат

Пример страницы Помощь / FAQ — help.dropbox.com
Пример страницы Помощь / FAQ — help.dropbox.com

Пример страницы Помощь / FAQ — help.dropbox.com

Зачастую входящие вопросы не связаны напрямую с вашими продуктами, выставлением счетов или доставкой; пользователи могут запрашивать разнообразную информацию, отсутствующую на вашем сайте. Вот где вступает в игру раздел часто задаваемых вопросов.

Страница FAQ довольно проста и дает много преимуществ. Как упомянуто выше, сосредоточьтесь на том, чтобы отвечать на реальные вопросы клиентов и повторяющиеся специфические вопросы, найденные в семантике поиска.

Разделение по темам

Рассортируйте ваши вопросы и ответы. Для каждой темы должен быть отдельный раздел. Таким образом, посетители сайта смогут перейти прямо к нужному вопросу, не блуждая во всем остальном.

Поиск

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

Отвечайте на вопросы напрямую

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

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

Общение в чате не обязательно означает, что он «живой». Службы чата могут быть настроены на передачу запросов в службу поддержки клиентов. Таким образом, вы не предоставляете ответы на странице в режиме реального времени, а получаете мейл с запросом от вашего посетителя, чтобы продолжить общение.

Другой вариант — сделать чат автоматическим: использовать чат-бота. Чат-боты анализируют вопросы и могут автоматически предоставлять ответы, направлять посетителей сайта на страницы или разделы сайта, которые они не смогли найти или просто не захотели тратить время на поиск.

В целом, создание страницы часто задаваемых вопросов только ради ее наличия — это пустая трата времени и ресурсов. Убедитесь, что вы тщательно поработали над ее контентом, и тогда у вас есть хороший потенциал для увеличения end-to-end коэффициентов конверсии.

Вакансии

Зачем создавать: для развития своего HR, привлечения сотрудников и нишевого ранжирования по ключевым словам.

Содержание:

  • Преимущества работы у нас
  • Вакансии
  • Фильтры
  • Форма заявки
  • Медиа, связанные с ваше корпоративной культурой, мероприятиями, рабочей средой и т.д.

Пример страницы Вакансии — spotifyjobs.com
Пример страницы Вакансии — spotifyjobs.com

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

Чем вы лучше остальных?

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

Кого конкретно вы ищете?

Ключевой раздел вашей страницы «Карьера» — это вакансии. Как и FAQ, этот раздел нуждается в классификации. Сегментируйте свои вакансии по уровню профессионализма, или отделу. Если у вас много вакансий одновременно, рассмотрите возможность добавления фильтра или поля поиска.

Отдельная страница для каждой вакансии

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

Аргументируйте

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

Блог

Зачем создавать: делиться своими знаниями и опытом, исследованиями и идеями, получать мощную поддержку SEO.
Содержание:

  • Контент, который создает ценность
  • Привлекательные изображения
  • Видео
  • Комментарии
  • CTA
  • Ссылки на профили в соцсетях

Пример страницы Блог — goodonyou.eco/category/stories
Пример страницы Блог — goodonyou.eco/category/stories

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

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

“Напрасно ты приобрел знания, если не передал их другим”
Дварим Рабба (комментарий к Книге Второзаконие)

Если ваш блог регулярно обновляется, поисковые системы видят, что ваш сайт “живой” и чаще индексируют ваш сайт.

Мы уже упоминали про рейтинг по релевантным ключевым словам. Для этого убедитесь, что ваши тексты имеют относительно большой объем, не менее 250 слов. Для лонгридов — от 800 слов. Осторожно придерживайтесь SEO оптимизации текстов.

Добавив блог, вы естественным образом получаете еще одно преимущество: увеличение продолжительности сеансов пользователей, которое поднимает вас в поисковой выдаче. Чем более интересны ваши посты и записи, тем больше времени посетители будут тратить на их чтение и, кстати, не переписывайте (rewrite) чужие блоги, это неэффективно.

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

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

Заманите читателя

Верхняя страница блога обычно состоит из отдельных ссылок на посты и нумерации страниц. Ссылки обычно помещаются в элементы страницы, имеющие: изображение обложки, заголовок поста и описание, где последнее может быть идентично шапке статьи. Таким образом, посетители по превью сразу получают представление о записи и с большей вероятностью откроют ее. И один важный совет — никогда не делайте кликбейт-заголовки!

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

С точки зрения Pillar модели это позволит URL-адресам, таким как «https://yoursite.com/blog/#seo», выступать в качестве идеальных хабов для накопления органического трафика со смежных кластерных страниц. Роботы идентифицируют страницы как смежные, если они правильно сшиты.

Упорядочьте содержимое

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

Изображения и видео

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

Позвольте аудитории высказаться

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

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

Кнопки навигации

Чтобы помочь читателям результативно перемещаться, возьмите в качестве примера страницу продукта и добавьте кнопки «Предыдущий/Следующий» на странице каждого поста. Также должна быть кнопка, которая возвращает читателей к списку всех ваших записей.

Расшарьте контент

Наконец, сделайте так, чтобы ваши посетители могли легко передавать свои знания другим, добавив share-кнопки соцсетей. Это дает множество преимуществ. Среди наиболее ценных — увеличение узнаваемости бренда и рост реферального трафика на ваш сайт с других платформ.

Страница новостей

Что у нас по новостям? Похоже, что на сайтах компаний менее 1% посетителей считают новости стоящими своего времени. Кроме того, корпоративные новости часто воспринимаются как слишком субъективные и самовосхваляющие. Изучите поведенческие паттерны групп пользователей; возможно, вы обнаружите, что тот небольшой процент посетителей, интересующихся вашими новостями — это те, кто конвертируются лучше остальных.

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

Контактная информация / связаться с нами

Зачем создавать: позволить посетителям оперативно связаться с вашей компанией и улучшить SEO.

Содержание:

  • Номера телефонов, e-mail (для разных целей)
  • Форма обратной связи
  • Карта

Пример страницы Контакты — rndhouse.com/contact
Пример страницы Контакты — rndhouse.com/contact

Хотя страница контактной информации является одной из базовых страниц для любого веб-сайта, она также является одной из самых важных.

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

Категоризация

Один из способов распределения потоков запросов по мейлам и телефонным номерам — по темам, например, общие запросы, вопросы сотрудничества, вакансии. Затем вы добавляете контактную информацию на свою страницу и ждете, когда сканеры сайта соберут электронную почту и раскроют все виды распространения спама. Но есть и лучший способ — контактные формы.

Создайте форму

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

Местоположение

Еще одна полезная функция для страницы контактов — отображение местоположения вашего офиса на карте. Просто адрес уже никому неинтересен. Некоторые компании выходят за рамки стандартной Google Maps или Яндекс Карты и превращают свою карту в нечто уникальное.

Ошибка 404

Зачем создавать: Информирование пользователей об ошибках и перенаправление их на другие страницы.

Содержание:

  • Изображения / видео / интерактивные элементы
  • Сообщение об ошибке
  • Ссылки на другие страницы сайта

Пример страницы Ошибка — netflix.com/notfound
Пример страницы Ошибка — netflix.com/notfound

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

Ключевые моменты

Прежде всего, разместите ссылки на другие страницы. Как минимум должна быть ссылка на главную страницу.

Плохо, если ваша страница с ошибкой по сути является тупиком, такой вариант не понравится ни вашим посетителям, ни SEO. Можно и нужно перенаправлять трафик со страницы ошибки в правильное место.

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

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

Правовая информация

Зачем создавать: расскажите о своем соответствии требованиям законодательства.

Содержание:

  • Политика конфиденциальности
  • Уведомления об авторских правах
  • Правила и условия пользования
  • Дисклеймер
  • Злоупотребление или жалобы контактная информация
  • Патенты
  • Корпоративная политика

Пример страницы Privacy Policy — samuelsre.com/privacy-policy
Пример страницы Privacy Policy — samuelsre.com/privacy-policy

Очевидно, что обычный посетитель не будет заинтересован в посещении этой страницы. Но правовые страницы необходимы по закону и должны быть доступны на любой странице вашего сайта. Следовательно, было бы разумно разместить ссылки на них в футере страницы.

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

  1. Содержит всю необходимую информацию, разбитую на пронумерованные абзацы
  2. Написана в понятной для большинства людей форме
  3. Соответствует общему дизайну сайта

Заключение

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

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

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

Что касается нас, авторов этого руководства, то мы занимаемся этим уже 18 лет. И весь свой опыт постарались аккумулировать (помимо этого гайда) в мощном и одновременно простом инструменте Octopus.do, с помощью которого вы сможете бесплатно создать структуру веб-сайта, планировать контент и делиться этим с кем угодно. Регистрация необязательна.

Оригинал: The ultimate guide to your company website structure

(Вольный перевод: https://habr.com/ru/post/501430/)