Основные конструкции языка PHP.
Типы данных и переменные
<?php # Числа $one = 1; $number = -100; # Строки $str1 = 'i am a string'; $str2 = "i am a string too"; # Логические значения $yes = true; $no = false;
Преобразование типов
<?php
# Числа
$one = (int) '234';
$two = (string) 34;
Операции
<?php // Арифметические операции 1 + 5 - 8 * 6 / 2 ** 3 % 4; // Логические операции true || false && !true // Создание переменных $str = 'i am a string'; // Обращение к символам строки $str[0]; // i print_r("{$str}"); // => i am a string print_r($str); // => i am a string
Условные операторы:
-
if
else
if-else.
-
elseif
elseif – это комбинация конструкций if и else. Эта конструкция расширяет условную конструкцию if-else.
<?php if (логическое выражение) оператор; ?>
Если логическое выражение
истинно (true), то оператор
будет исполнен
Соответственно, если логическое выражение
ложно (false), то оператор
не исполняется. :
<?php if ($a > $b) echo "значение a больше, чем b"; ?>
<?php if (логическое выражение) инструкция_1; else инструкция_2; ?>
Если логическое выражение истинно, то выполняется инструкция_1
Иначе — выпооняется инструкция_2
.
<?php if ($a > $b) { echo "a больше, чем b"; } else { echo "a НЕ больше, чем b"; } ?>
<?php if (логическое_выражение): команды; elseif(другое_логическое_выражение): другие_команды; else: иначе_команды; endif ?>
<?php if (логическое_выражение_1) оператор_1; elseif (логическое_выражение_2) оператор_2; else оператор_3; ?>
Пример:
<?php if ($a > $b) { echo "a больше, чем b"; } elseif ($a == $b) { echo "a равен b"; } else { echo "a меньше, чем b"; } ?>
Циклы:
while
do while
for
foreach
break
continue
<?php while (логическое выражение) тело цикла; ?>
Если логическое выражение
истинно, выполняется тело цикла, в противном случае – переходим на следующий за циклом оператор.
Пример:
<?php $x=0; while ($x++<10) echo $x; // Выводит 12345678910 ?>
В отличие от цикла while, этот цикл проверяет значение выражения не до, а после каждого прохода. Таким образом, тело цикла выполняется хотя бы один раз.
<?php do { тело_цикла; } while (логическое_выражение); ?>
После очередной итерации проверяется, истинно ли логическое_выражение, и, если это так, управление передается вновь на начало цикла, в противном случае цикл обрывается. Пример скрипта:
<?php $x = 1; do { echo $x; } while ($x++<10); ?>
<?php for (инициализирующие_команды; условие_цикла; команды_после_итерации) { тело_цикла; } ?>
Цикл for начинает свою работу с выполнения инициализирующих_команд
.
Данные команды выполняются только один раз.
После этого проверяется условие_цикла
,
если оно истинно (true), то выполняется тело_цикла
.
После того, как будет выполнен последний оператор тела, выполняются команды_после_итерации
.
Затем снова проверяется условие_цикла
. Если оно истинно (true), выполняется тело_цикла
и команды_после_итерации.
<?php for ($x=0; $x<10; $x++) echo $x; //Выведит 0123456789 ?>
Для цикла for имеется и альтернативный синтаксис:
<?php for(инициализирующие_команды; условие_цикла; команды_после_итерации): операторы; endfor; ?>
<?php foreach (массив as $ключ=>$значение) команды; ?>
Команды циклически выполняются для каждого элемента массива,
при этом очередная пара ключ=>значение
оказывается в переменных $ключ
и $значение
.
Пример:
<?php $names["Иванов"] = "Андрей"; $names["Петров"] = "Борис"; $names["Волков"] = "Сергей"; $names["Макаров"] = "Федор"; foreach ($names as $key => $value) { echo "<b>$value $key</b><br>"; } ?>
Рассмотренный сценарий выводит:
Андрей Иванов Борис Петров Сергей Волков Федор Макаров
У цикла foreach имеется и другая форма записи, которую следует применять, когда нас не интересует значение ключа очередного элемента.
<?php foreach (массив as $значение) команды; ?>
Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть “видны” из тела цикла. Что позволяет в качестве массива использовать не только переменную, но и результат работы какой-нибудь функции, возвращающей массив (в этом случае функция будет вызвана всего один раз – до начала цикла, а затем работа будет производиться с копией возвращенного значения).
конструкция break, которая осуществляет немедленный выход из цикла.
<?php break; // По умолчанию break(номер_цикла); // Для вложенных циклов (указывается номер прерываемого цикла) ?>
Пример:
<?php $x=0; while ($x++<10) { if ($x==3) break; echo "<b>Итерация $x</b><br>"; } // Когда $x равен 3, цикл прерывается ?>
Если нам нужно прервать работу определенного (вложенного) цикла, то нужно передать конструкции break параметр – номер_цикла, например, break(1).
Нумерация циклов выглядит так:
for (...) // Третий цикл { for (...) // Второй цикл { for (...) // Первый цикл { } } }
Конструкция continue завершает текущую итерацию цикла и переходит к новой.
<?php $x=0; while ($x++<5) { if ($x==3) continue; echo "<b>Итерация $x</b><br>"; } // Цикл прервется только на третьей итерации ?>
Cкрипт выведет:
Итерация 1 Итерация 2 Итерация 4 Итерация 5
Конструкция выбора switch-case
<?php switch(выражение) { case значение1: команды1; [break;] case значение2: команды2; [break;] . . . case значениеN: командыN; [break;] [default: команды_по_умолчанию; [break]] } ?>
Вычисляется выражение
;
команда N
выполняется если значение N
равно выражению.
Пример в сравнении с if-else:
<?php
$x=1;
// Используем if-else
if ($x == 0) {
echo "x=0<br>";
} elseif ($x == 1) {
echo "x=1<br>";
} elseif ($x == 2) {
echo "x=2<br>";
}
// Используем switch-case
switch ($x) {
case 0:
echo "x=0<br>";
break;
case 1:
echo "x=1<br>";
break;
case 2:
echo "x=2<br>";
break;
}
?>
Функции
<?php // Определение function sum(a,b) { $c = a + b; echo $c; } // Вызов sum(3,5); // выводит 8
Пример выше не является чистой функцией
Конструкция возврата значений return
<?php function retfunct() { return 7; } echo retfunct(); // выводит '7'. ?>
Пример возврата конструкцией return массивов:
<?php function numbers() { return array (0, 1, 2); } list ($zero, $one, $two) = numbers(); echo $zero; echo $one; echo $two; // Выводит '012' ?>
Конструкции включений:
Конструкции включений позволяют собирать PHP программу (скрипт) из нескольких отдельных файлов.
require()
include
require_once и include_once
Конструкция require позволяет включать код до выполнения сценария.
require имя_файла;
При запуске программы интерпретатор заменит инструкцию на содержимое файла имя_файла (этот файл может также содержать сценарий на PHP).
Конструкция include также предназначена для включения файлов в код сценария PHP. В отличие от конструкции require конструкция include позволяет включать файлы в код PHP скрипта во время выполнения сценария.
include имя_файла;
Используя конструкции однократного включения require_once и include_once, можно быть уверенным, что один файл не будет включен дважды. Работают конструкции require_once и include_once так же, как и requre и include. Разница в их работе лишь в том, что перед включением файла интерпрететор проверяет, включен ли указанный файл ранее или нет. Если да, то файл не будет включен вновь.
<?php // file: print.php function sayHi() { print_r('Hi!'); } // file: index.php require_once 'print.php'; sayHi(); // => Hi!
Рассмотрим следующий пример
<?php // file: print.php print_r("Hi from print.php!\n"); // file: index.php require_once 'print.php'; print_r("Hi from index.php!\n");
Попробуем запустить:
$ php index.php Hi from print.php! Hi from index.php!
Видно, что сначала выполнился код, находящийся во включаемом файле, и только потом код в файле index.php. Этот механизм рекурсивен по своей природе: если во включаемом файле есть другой включаемый файл, то сначала исполнится он. Такое поведение чем-то похоже на матрешку. Можно сказать, что весь код всех файлов проекта находится в одном пространстве и доступен для использования напрямую.
Из всех четырех конструкций для включения файлов пользоваться имеет смысл только одной — require_once. Она обладает двумя важными свойствами:
- Если файл отсутствует, то эта конструкция приведет к ошибке, и программа остановит свое выполнение;
- Если в require_once передается файл, который уже был где-то загружен ранее, то она не будет выполнять этот файл повторно, но код этого файла все равно станет доступным.
Эти два условия важны, так как код, опирающийся на них, получается более качественным и простым. В отличие от require_once, остальные конструкции не отвечают этим требованиям: require исполняет включаемый файл каждый раз, а include и include_once не приводят к ошибке в ситуации, когда файла не существует.