PHP язык программирования: базовые конструкции и практические примеры

Раздел: Языки программирования -> Основы 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().

PHP как язык программирования (примеры кода) - comments

En
Php язык программирования код (php)