PHP язык программирования: базовые конструкции и практические примеры
Основные конструкции PHP
PHP (Hypertext Preprocessor) - скриптовый язык, предназначенный для веб-разработки. Код выполняется на сервере, а результат отправляется клиенту. Рассмотрим базовые элементы языка.
Как вывести текст на экран?
Основной способ - конструкция echo. Она может принимать несколько аргументов через запятую или строку с конкатенацией.
<?php
echo 'Привет, мир!';
echo 'Сегодня ', date('d.m.Y');
?>
Результат:
Привет, мир!Сегодня 27.03.2025
Какие ещё есть способы вывода?
Функция print возвращает 1 и принимает только один аргумент. printf форматирует строку по шаблону, а sprintf возвращает результат в переменную.
<?php
print 'Только один аргумент';
printf('Число: %d, строка: %s', 42, 'тест');
$formatted = sprintf('Итог: %.2f', 3.14159);
echo $formatted;
?>
Результат:
Только один аргументЧисло: 42, строка: тестИтог: 3.14
Типичные ошибки вывода
Ошибка 1: Пропущенная точка с запятой. Решение - всегда завершать инструкцию символом ;.
Ошибка 2: Использование print с несколькими аргументами (вызовет синтаксическую ошибку). Решение - объединять строки через конкатенацию или использовать echo.
Ошибка 3: Путаница между одинарными и двойными кавычками: в одинарных не обрабатываются переменные и спецсимволы (кроме \' и \\). Решение - выбирать тип кавычек в соответствии с задачей.
Как объявить переменную и правильно вывести её значение?
Переменные начинаются с $, имена чувствительны к регистру. Тип определяется автоматически. В двойных кавычках переменные интерполируются.
<?php
$name = 'Анна';
$age = 25;
echo "Меня зовут $name, мне $age лет.";
?>
Результат:
Меня зовут Анна, мне 25 лет.
Какие особенности объявления переменных?
Использование фигурных скобок для сложных выражений внутри строки:
<?php
$price = 150;
echo "Цена со скидкой: {$price} рублей.";
echo "Цена со скидкой: ${price} рублей."; // устаревший стиль
?>
Можно использовать heredoc-синтаксис для многострочных строк:
<?php
$name = 'Иван';
echo <<<EOT
Привет, $name!
Это heredoc строка.
EOT;
?>
Результат:
Привет, Иван! Это heredoc строка.
Распространённые проблемы с переменными
Ошибка 1: Обращение к неопределённой переменной (Undefined variable). Решение - инициализировать переменную перед использованием или проверять через isset().
Ошибка 2: Смешение имени - $myVar и $myvar разные переменные. Решение - соблюдать единый стиль, например camelCase.
Ошибка 3: Попытка использовать переменную в одинарных кавычках - она не будет интерполирована. Решение - использовать двойные кавычки или конкатенацию.
Как проверить условие с помощью if-else?
Конструкция if выполняет блок кода при истинности условия. else - альтернатива, elseif - дополнительные проверки.
<?php
$score = 85;
if ($score >= 90) {
echo 'Отлично!';
} elseif ($score >= 70) {
echo 'Хорошо';
} else {
echo 'Нужно подтянуть';
}
?>
Результат:
Хорошо
Какие ещё условные конструкции существуют?
Тернарный оператор для простых условий:
<?php
$isLogged = true;
echo $isLogged ? 'Добро пожаловать' : 'Войдите';
?>
Конструкция switch для множественного сравнения с одним выражением:
<?php
$day = 3;
switch ($day) {
case 1:
echo 'Понедельник';
break;
case 2:
echo 'Вторник';
break;
default:
echo 'Другой день';
}
?>
Результат:
Другой день
Типичные ошибки в условиях
Ошибка 1: Использование = вместо == или === - присваивание вместо сравнения. Решение - всегда писать == или ===.
Ошибка 2: Забытый break в switch - выполнение провалится в следующий case. Решение - добавлять break или return.
Ошибка 3: Сравнение строк с разной кодировкой - операторы сравнения работают по байтам. Решение - использовать strcmp() или нормализацию строк.
Как организовать повторение кода с помощью цикла for?
Цикл for содержит инициализацию, условие продолжения и инкремент. Удобен для перебора по индексу.
<?php
for ($i = 1; $i <= 5; $i++) {
echo "Квадрат числа $i равен " . ($i * $i) . "<br>";
}
?>
Результат:
Квадрат числа 1 равен 1
Квадрат числа 2 равен 4
Квадрат числа 3 равен 9
Квадрат числа 4 равен 16
Квадрат числа 5 равен 25
Какие циклы пригодятся для работы с массивами?
while - выполняется пока условие истинно; foreach - итерация по элементам массива без явного счётчика.
<?php
$fruits = ['яблоко', 'банан', 'апельсин'];
foreach ($fruits as $index => $fruit) {
echo "$index: $fruit<br>";
}
?>
Результат:
0: яблоко
1: банан
2: апельсин
while с условием:
<?php
$i = 0;
while ($i < count($fruits)) {
echo $fruits[$i] . ' ';
$i++;
}
?>
Результат:
яблоко банан апельсин
Проблемы с циклами
Ошибка 1: Бесконечный цикл, если условие никогда не становится ложным. Решение - проверять изменение переменной внутри цикла.
Ошибка 2: Изменение массива во время итерации foreach по значению - оригинал не меняется. Решение - передавать по ссылке (&$value) или использовать индексы.
Ошибка 3: Использование for с ассоциативным массивом - ключи не последовательны. Решение - применять foreach.
Как создать и использовать функцию?
Функции помогают избежать повторения кода. Определяются ключевым словом function. Можно возвращать значение через return.
<?php
function add($a, $b) {
return $a + $b;
}
echo 'Сумма 3 и 5: ' . add(3, 5);
?>
Результат:
Сумма 3 и 5: 8
Какие современные виды функций доступны?
Анонимные функции (замыкания) и стрелочные функции (с PHP 7.4).
<?php
// Анонимная функция
$multiply = function($x, $y) {
return $x * $y;
};
echo 'Произведение 4*7: ' . $multiply(4, 7);
// Стрелочная функция (PHP 7.4+)
$square = fn($n) => $n * $n;
echo 'Квадрат 9: ' . $square(9);
?>
Результат:
Произведение 4*7: 28Квадрат 9: 81
Ошибки при работе с функциями
Ошибка 1: Дублирование имени функции - PHP выдаст фатальную ошибку. Решение - использовать уникальные имена или пространства имён.
Ошибка 2: Игнорирование области видимости - переменные внутри функции не доступны снаружи без global или передачи параметром. Решение - передавать данные через аргументы и возврат.
Ошибка 3: Неожиданный тип возвращаемого значения - слабая типизация может привести к конкатенации вместо сложения. Решение - использовать строгую типизацию (declare(strict_types=1);) или явное приведение.
Как создать массив и обращаться к его элементам?
Массивы бывают индексированными (числовые ключи) и ассоциативными (строковые ключи). Создаются через array() или короткий синтаксис [].
<?php
$colors = ['красный', 'зелёный', 'синий'];
echo $colors[0]; // красный
$user = ['name' => 'Пётр', 'age' => 30];
echo $user['name']; // Пётр
?>
Результат:
красныйПётр
Какие продвинутые операции с массивами существуют?
Многомерные массивы:
<?php
$matrix = [
[1, 2, 3],
[4, 5, 6],
];
echo $matrix[1][2]; // 6
?>
Функции array_map, array_filter:
<?php
$numbers = [1, 2, 3, 4, 5];
$doubled = array_map(fn($n) => $n * 2, $numbers);
print_r($doubled);
?>
Результат:
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 )
Типичные ошибки при работе с массивами
Ошибка 1: Обращение к несуществующему ключу - выдаёт предупреждение и возвращает null. Решение - проверять через isset() или array_key_exists().
Ошибка 2: Использование [] для добавления элемента в ассоциативный массив без указания ключа - добавится с числовым индексом. Решение - явно задавать ключ.
Ошибка 3: Сравнение массивов через == или === - учитывается порядок и типы. Решение - для неупорядоченных массивов использовать array_diff().
Расширенные примеры кода с пояснениями
Пример 1: Рекурсивная функция для вычисления факториала
Рекурсия - вызов функцией самой себя. Важно задать условие выхода.
<?php
function factorial($n) {
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
echo 'Факториал 5 = ' . factorial(5);
?>
Результат:
Факториал 5 = 120
Пояснение: factorial(5) вызывает factorial(4) и т.д., пока не достигнет factorial(1), который возвращает 1. Затем значения перемножаются обратно.
Пример 2: Обработка GET-запроса и вывод данных формы
Создадим простую HTML-форму и PHP-скрипт для её обработки.
<!-- index.html -->
<form action="handler.php" method="GET">
<label>Имя: <input type="text" name="username"></label>
<input type="submit" value="Отправить">
</form>
<!-- handler.php -->
<?php
if (isset($_GET['username'])) {
$name = htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8');
echo "Привет, $name!";
} else {
echo 'Пожалуйста, укажите имя.';
}
?>
Ввод: Анна
Результат:
Привет, Анна!
Ошибки: Не экранированный вывод приводит к XSS-уязвимости. htmlspecialchars() защищает от инъекций. Неправильная проверка через empty() может пропустить пустую строку.
Пример 3: Работа с датами и временем
Функции date() и strtotime() позволяют форматировать и вычислять даты.
<?php
echo 'Сегодня: ' . date('Y-m-d H:i:s') . "<br>";
$nextWeek = strtotime('+1 week');
echo 'Через неделю: ' . date('d.m.Y', $nextWeek) . "<br>";
// Разница между датами
$start = strtotime('2025-01-01');
$end = time();
$days = floor(($end - $start) / (60 * 60 * 24));
echo 'Прошло дней с Нового года: ' . $days;
?>
Результат (пример):
Сегодня: 2025-03-27 10:15:30
Через неделю: 03.04.2025
Прошло дней с Нового года: 85
Возможные проблемы: Часовой пояс по умолчанию берётся из настроек сервера. Установить нужный можно через date_default_timezone_set('Europe/Moscow');
Пример 4: Сортировка массива с пользовательским компаратором
Функция usort() позволяет отсортировать массив по произвольному правилу.
<?php
$people = [
['name' => 'Иван', 'age' => 25],
['name' => 'Мария', 'age' => 20],
['name' => 'Пётр', 'age' => 30],
];
usort($people, function($a, $b) {
return $a['age'] <=> $b['age']; // космический корабль (PHP 7+)
});
print_r($people);
?>
Результат:
Array ( [0] => Array ( [name] => Мария [age] => 20 ) [1] => Array ( [name] => Иван [age] => 25 ) [2] => Array ( [name] => Пётр [age] => 30 ) )
Объяснение: usort принимает коллбэк, который должен вернуть -1, 0 или 1. Оператор <=> возвращает именно такие значения.
Сложности при расширенных примерах
Рекурсия: При больших значениях n возможен переполнение стека. Решение - использовать итеративный подход.
GET-формы: Нельзя передавать большие объёмы данных; данные видны в URL. Для конфиденциальной информации используют метод POST.
Даты: strtotime() некорректно обрабатывает некоторые локализованные строки. Решение - использовать DateTime::createFromFormat().
Сортировка: Нестабильная сортировка usort может переставить равные элементы. Для стабильности используйте array_multisort().