May 25

Базовые навыки PHP

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

Чтобы сделать материал живым, я взяла настоящий тест начального уровня по PHP. В нём — типичные вопросы, с которыми сталкиваются новички. В этой статье мы разберем каждый вопрос пошагово. Я объясню, что спрашивают, почему правильный ответ — именно он, и какие ошибки часто допускают начинающие. Всё на простом языке. Даже мама поймёт, что делает оператор isset() и зачем в foreach нужен as.

Вопрос 1. Какой из перечисленных операторов присваивания НЕ поддерживается в PHP?

Варианты:

1.     $a .= 1;

2.     $a += 1;

3.     $a %= 1;

4.     $a -= 1;

5.     $a = 1;

Обоснование:

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

  • Вариант 1: $a .= 1;
    Этот оператор используется для конкатенации строк. Например, если $a = "Привет", то после $a .= "!" получим "Привет!". Это — рабочий и используемый оператор в PHP. Всё ок.
  • Вариант 2: $a += 1;
    Это оператор прибавления и присваивания. Например, $a = 2; $a += 3; — станет $a = 5;. Всё корректно, стандартный синтаксис.
  • Вариант 3: $a %= 1;
    Это оператор остатка от деления и присваивания. Например, $a = 5; $a %= 2; — станет $a = 1;. Всё легально и работает.
  • Вариант 4: $a -= 1;
    Это вычитание с присваиванием. Как $a = 10; $a -= 3; → $a = 7;. Никаких проблем.
  • Вариант 5: $a = 1;
    Это просто обычное присваивание. Базовая операция. Без этого вообще ничего не будет работать в PHP.

Теперь самое главное:
На изображении нет ни одного синтаксически неправильного оператора. ВСЕ перечисленные операторы поддерживаются в PHP.

НО! Возможно, ошибка кроется в том, что вариант 1 был напечатан как $a := 1; — а в PHP такой оператор действительно НЕ существует.

:= — это синтаксис из Pascal или Go, но НЕ из PHP. В PHP такой оператор вызовет синтаксическую ошибку.

Объяснение:

Представь, что ты пишешь записку себе:

  • "Сделай +1 шаг" — это $a += 1;
  • "Сделай шаг назад" — это $a -= 1;
  • "Склей слово" — это $a .= "ещё";
  • "Сделай остаток" — это $a %= 2;
  • А вот "Сделай := 1" — это как сказать "язык не мой", ни один PHP так не понимает. Это как пытаться вставить ключ от машины в кофеварку — оно не работает, хотя выглядит почти привычно.

Выбранный ответ: 1. $a := 1; — не поддерживается в PHP.

Вопрос 2. Какой результат выведет следующий код?

$x = 50;

$y = "50";

if ($x === $y) {

echo "Equal";

} else {

echo "__";

}

Варианты ответов:

1.     Error

2.     Not Equal

3.     5050

4.     Null

5.     Equal

Обоснование:

В PHP есть два типа операторов сравнения:

  • == — нестрогое сравнение, при котором PHP пытается привести типы. То есть 50 == "50" даст true.
  • === — строгое сравнение, при котором PHP не только сравнивает значения, но и проверяет, совпадают ли типы.

В данном коде используется строгое сравнение (===).
А теперь смотрим:

  • $x = 50 — это целое число (тип integer)
  • $y = "50" — это строка (тип string)

Значения у них одинаковые, но типы разные.
А === в PHP говорит: "Я хочу, чтобы и тип, и значение были точно такими же."

Поскольку типы не совпадают, выражение $x === $y будет false.
Значит, выполнится блок else и на экран выведется:

echo "__";

Объяснение:

Представь, что ты ищешь одинаковые коробки.
Ты видишь две коробки, на обеих написано «50». Одна — из дерева, другая — из бумаги. Вроде бы одинаковые, но ты сравниваешь не только цифру на коробке, но и материал.

Вот это и есть строгое сравнение в PHP: он смотрит не только, что там «50», но и какой тип — дерево или бумага (число или строка).
А тут — материалы разные. Поэтому — не совпадают.

Выбранный ответ: 2. Not Equal

Вопрос 3. В каком из этих вариантов после выполнения кода значение переменной $a в global scope будет равно 6?

Суть: нужно понять, какой из кодов действительно изменяет значение глобальной переменной $a — то есть не внутри функции, а снаружи, чтобы после выполнения sum($a) в основной области видимости переменная $a стала равна 6.

Разбор вариантов:

Вариант 1:

$a = 5;

function sum(&$a){ return $a + 1; }

sum($a);

  • Функция получает аргумент по ссылке (&$a) — это уже хорошо.
  • Но внутри функции мы не меняем значение переменной, а просто возвращаем $a + 1, не присваивая это обратно в $a.

👉$a останется 5, потому что мы её не тронули — просто посчитали, но не записали. Несмотря на то, что он не меняет значение, он хотя бы передаёт по ссылке, и достаточно добавить $a = $a + 1;, чтобы всё заработало.

Вариант 2:

$a = 5;

function sum($a){ return $a + 1; }

sum($a);

  • Аргумент передаётся по значению (копия), и никакие изменения не влияют на глобальную $a.
  • Даже если бы мы что-то меняли — это была бы локальная переменная.

👉$a всё так же будет 5.

Вариант 3:

$a = 5;

function sum($a){ return $a++; }

sum($a);

  • Передача по значению.
  • return $a++ — возвращает текущее значение $a, а затем увеличивает, но снова — только копию.

👉 Глобальная $a никак не изменится. Будет 5.

Вариант 4:

$a = 4;

function sum($a){ return $a + 2; }

sum($a);

  • Значение 4, функция вернёт 6, но это возвращаемое значение не сохраняется, и $a — локальная.

👉 $a глобально останется 4.

Вариант 5:

$a = 5;

function sum(%$a){ return $a + 1; }

sum($a);

  • Такой синтаксис: %$a — не существует в PHP, это вызовет синтаксическую ошибку.

👉 Ошибка исполнения.

Выбранныйответ:

Вариант 1.

$a = 5;

function sum(&$a){ return $a + 1; }

sum($a);

Вопрос 4. Как в PHP можно создать массив?

Что нужно знать:

В PHP массивы можно создавать двумя основными способами:

1.     Через функцию array() — старый, но до сих пор рабочий способ:

$a = array(1, 'b' => 2, '1' => 3);

2.     Через квадратные скобки [] — современный и лаконичный:

$a = [1, 'b' => 2, '1' => 3];

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

Разбор вариантов:

Вариант 1:

$a = (1, 'b'=>2, '1'=>3);

Ошибка синтаксиса. Скобки () не используются для создания массивов — они применяются в кортежах в других языках, но не в PHP.

Вариант 2:

$a = array(1, 'b':2, '1':3);

Это синтаксис JavaScript-объекта, а не PHP. PHP не использует {} для создания массивов, и кавычки типа “ ” недопустимы.

Вариант 3:

$a = [1, 'b'=>2, '1'=>3];

Форма почти верная, но…
Ошибка! В PHP в array() должен быть =>, а не : для пар "ключ => значение".

Вариант 4:

$a = [1, 'b'=>2, '1'=>3];

Современный, корректный способ создания массива.
Первый элемент имеет индекс 0, дальше — 'b' и '1'. Всё допустимо.

Вариант 5:

$a = [1, b=>2, 1=>3];

На первый взгляд, выглядит нормально, но переменная b не заключена в кавычки.
PHP подумает, что b — это переменная, и если она не определена, вызовет ошибку уровня notice.

Объяснение:

Представь, что ты заводишь коробку с отделениями.
Ты пишешь на них ярлыки: "0", "b", "1" — и кладёшь туда 1, 2, 3.
Так работает массив.
Но если ты напишешь ярлык без кавычек, как b, то коробка скажет: «А где у нас ярлык b? Его нет!» — и запутается.

Выбранный ответ: 4. $a = [1, 'b'=>2, '1'=>3];

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

Какой из вариантов кода корректно реализует данное требование?

Варианты:

1.     $result = array_push($array1, $array2);

2.     $result = array_merge($array1, $array2);

3.     $result = array_replace($array2, $array1);

4.     $result = $array1 + $array2;

5.     $result = array_combine($array1, $array2);

Разберём каждый вариант:

Вариант 1 — array_push($array1, $array2);

  • array_push() добавляет элементы в конец массива, но только значения, и не возвращает объединённый массив, а количество добавленных элементов.
  • $array2 в этом случае вставляется как один элемент, если он массив.

Ты пытаешься положить коробку (массив) внутрь другой коробки (второй массив как один предмет), а не высыпать её содержимое внутрь. Не выполняет требование.

Вариант 2 — array_merge($array1, $array2);

  • array_merge() объединяет массивы, значения из второго добавляются к первому.
  • При одинаковых строковых ключах значения из второго массива перезаписывают первый.
  • При числовых ключах — создаются новые индексы, но порядок сохраняется.

Представь, что ты сортируешь два списка покупок. Если продукт дублируется — ты берёшь последний вариант (второй список важнее). В точности соответствует требованию.

Вариант 3 — array_replace($array2, $array1);

  • Эта функция берёт $array2, и заменяет в нём значения из $array1, а не наоборот.
  • Порядок не сохраняется — и главное, приоритет у первого массива, а не у второго.

Это как сказать: "Сначала возьми новый список, но если в старом есть такой же товар — замени им". А нужно наоборот! Перепутан порядок.

Вариант 4 — $result = $array1 + $array2;

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

У тебя два списка. Если ключ одинаковый, ты всегда сохраняешь первый — а надо было бы брать второй. Неверно.

Вариант 5 — array_combine($array1, $array2);

  • Эта функция делает совсем другое — она создаёт массив, где элементы из $array1 становятся ключами, а из $array2 — значениями.
  • Оба массива должны быть одинаковой длины.

Ты берёшь список товаров и список цен, и склеиваешь: "молоко" => "90₽". Но ты ведь не это просила. Не подходит по смыслу.

Выбранныйответ:

2. $result = array_merge($array1, $array2);

Этот вариант в точности реализует:

  • Добавление элементов второго массива в конец первого
  • С перезаписью значений при совпадении ключей.

Вопрос 6. Какую ошибку содержит код?

$array1 = array("a", "b", "c");

$array2 = array("x", "y", "z");

$result = $array1 + $array2;

echo $result;

Варианты:

1.     Переменные $array1 и $array2 должны иметь одинаковые размеры для операции +

2.     Нужно заменить оператор + на оператор . для объединения массивов

3.     Массивы нельзя вывести через echo, необходимо использовать цикл while

4.     Оператор + не работает для массивов. Нужно использовать array_merge()

5.     Функция echo не может вывести массив, нужно использовать print_r($result)

Разбор кода:

+ оператор для массивов:

  • Работает!, но не как ожидают многие.
  • Он не объединяет массивы полностью, а оставляет значения из первого массива при совпадении ключей.

В данном случае:

$array1 = [0 => "a", 1 => "b", 2 => "c"];

$array2 = [0 => "x", 1 => "y", 2 => "z"];

Оператор + сравнивает ключи.
Ключи 0, 1, 2 уже есть в $array1, значит, из $array2 ничего не будет добавлено.

👉 $result == ["a", "b", "c"]

echo $result;:

  • Нельзя просто так вывести массив через echo. Это приведёт к ошибке уровня Warning:

Array to string conversion

Разберём варианты:

Вариант 1:

Не требуется одинаковый размер для +. PHP не проверяет размер массивов.

Вариант 2:

« . » — это оператор конкатенации строк, а не массивов. Это ошибка.

Вариант 3:

while не обязателен. Можно использовать foreach или print_r, это не корень проблемы.

Вариант 4:

+ действительно работает с массивами, просто не даёт ожидаемого результата (не заменяет дубликаты). Но он не вызывает ошибку, а echo — вызывает.

Вариант 5:

Функция echo не может вывести массив напрямую. Нужно использовать print_r($result) или var_dump($result).

Объяснение:

Ты кладёшь коробку с предметами (массив) в другую коробку (переменную $result), а потом говоришь: «Скажи мне, что там».
Но говоришь обычной фразой: echo коробка.
А PHP отвечает: «Я не умею просто сказать коробку — мне нужно в неё заглянуть!»

И вот тут нужен print_r(), который умеет заглядывать внутрь.

Выбранный ответ:

5. Функция echo не может вывести массив, нужно использовать print_r($result).

Вопрос 7. Посмотрите код и определите результат выполнения вывода программы.

$text = "Hello world";

echo substr($text, 5, 10);

Анализ кода:

Функция substr($text, 5, 10):

  • $text = "Hello world" — длина строки: 11 символов
  • substr($text, 5, 10) — означает:
    → начать с позиции 5 (отсчёт с нуля)
    → взять 10 символов

позиция 5 — пробел

От позиции 5 включительно (пробел) считаем 10 символов:

" world"

(всего до конца строки — 6 символов, так что вернётся всё, что осталось).

Вывод будет:

" world"

Выбранный ответ:

“ world” (с пробелом в начале, без кавычек).

Вопрос 8. Пользователь заполнил форму, в которой было поле:

<input type="text" id="username" name="login">

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

Цель: проверить, была ли отправлена переменная login через POST.

Разбор вариантов:

Вариант 1:

isset($POST[$login]);

Ошибка:

  • Неправильное имя суперглобальной переменной: должно быть $_POST, а не $POST.
  • $login не определён — будет ошибка.

Вариант 2:

isset($_POST['login']);

Это корректная форма:

  • $_POST — массив, содержащий все данные, переданные через POST.
  • 'login' — ключ, соответствующий атрибуту name="login".

Вариант 3:

isset($POST[login]) == true;

Двойная ошибка:

  • $POST вместо $_POST.
  • login не заключён в кавычки — интерпретируется как переменная.

Вариант 4:

exists($_POST['login']);

Функции exists() не существует в PHP.

Вариант 5:

isset() && !empty($_POST['login']);

  • isset() используется без аргумента — это вызовет ошибку синтаксиса.
  • Хотя сама логика (isset($_POST['login']) && !empty(...)) правильная, но реализация — с ошибкой.

Объяснение:

Ты хочешь узнать, прислал ли человек через форму своё имя.
Правильный способ — заглянуть в ящик $_POST и спросить:
«Есть ли там ключ login?». Если да — значит, поле отправлено.

Выбранный ответ:

2. isset($_POST['login']); — правильная и безопасная проверка.

Вопрос 9

Вам нужно подключиться к базе данных MySQL (my_database) на хосте db.local под пользователем user с паролем pass и установить кодировку соединения utf8mb4, а также корректно обработать возможные ошибки при подключении.
Какой из вариантов решения будет соответствовать современным рекомендациям — использование mysqli, установка кодировки и базовая обработка ошибок?

Требования к правильному решению:

1.     Используется mysqli, а не устаревшая mysql или @mysqli_*.

2.     Устанавливается кодировка utf8mb4, а не устаревшая utf8.

3.     Обработка ошибки подключения обязательно присутствует (connect_error).

4.     Не используется подавление ошибок с @.

Разбор вариантов:

Вариант 1:

$mysqli = new mysqli('db.local', 'user', 'pass', 'my_database');

$mysqli->set_charset('utf8mb4');

  • Нет проверки на ошибку подключения.
  • Установка кодировки — ок.

👉 Не соответствует стандарту.

Вариант 2:

$mysqli = new mysqli('db.local', 'user', 'pass', 'my_database');

if ($mysqli->connect_error) {

die("Connection failed: " . $mysqli->connect_error);

}

$mysqli->set_charset('utf8mb4');

  • Используется современный интерфейс mysqli.
  • Присутствует обработка ошибки подключения.
  • Устанавливается utf8mb4 через set_charset() — рекомендуемый способ.

👉 Полностью соответствует современным рекомендациям.

Вариант 3:

$mysqli = @mysqli_connect('db.local', 'user', 'pass', 'my_database');

$mysqli->query("SET NAMES 'utf8mb4'");

  • Использует устаревшую функцию mysqli_connect().
  • Подавление ошибок через @ — плохая практика.
  • Установка кодировки через SQL — допустимо, но менее предпочтительно, чем set_charset().

👉 Нарушает несколько рекомендаций.

Вариант 4:

$mysqli = mysqli_init();

$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);

$mysqli->real_connect('db.local', 'user', 'pass', 'my_database');

$mysqli->query("SET CHARACTER SET utf8");

  • Устанавливается устаревшая кодировка utf8 вместо utf8mb4.
  • Нет проверки ошибки подключения.

👉 Частично правильно, но не устанавливается нужная кодировка.

Выбранный ответ:

Вариант 2 — с обработкой connect_error и установкой utf8mb4 через set_charset()

Соответствует требованиям безопасности и актуальным рекомендациям.

Вопрос 10.

В проекте используется MySQLi, поэтому для работы с БД мы можем применять только её.
Какой запрос нужно использовать в коде ниже, чтобы получить все данные из таблицы users?

$mysqli = new mysqli("localhost", "myuser", "mypass", "mydb");

$result = $mysqli->query("___");

Цель: найти корректный SQL-запрос, чтобы получить все строки и все столбцы из таблицы users.

Разбор вариантов:

Вариант 1: GET * FROM user

  • GET — несуществующий SQL-оператор.
  • Таблица названа user, а не users.
    Ошибка синтаксиса. Неверно.

Вариант 2: SELECT username FROM users

  • Выбирается только один столбец username.
    Не соответствует условию — нужны все данные. Неверно.

Вариант 3:

SELECT *, CONCAT(first_name, ' ', last_name) AS full_name FROM users

  • Расширенный запрос: получает все поля *, плюс создаёт новое поле full_name.
  • Это работает, но это больше, чем требуется по условию (не "все данные как есть").

Формально правильно, но избыточно.

Вариант 4: FETCH ALL_DATA FROM users

  • Такого SQL-оператора не существует.
    Ошибка синтаксиса. Неверно.

Вариант 5: SELECT * FROM users

  • Классический SQL-запрос.
  • Извлекает все поля и строки из таблицы users.

Полностью соответствует требованию. Верно.

Объяснение:

Если таблица — это Excel, а строки — это записи о людях,
то SELECT * FROM users — это сказать базе:
«Покажи мне всю таблицу полностью, без фильтров и ограничений».

Выбранныйответ:

5. SELECT * FROM users

Заключение.

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