Базовые навыки PHP
Когда человек хочет устроиться на работу программистом, его часто просят пройти тест — чтобы понять, знает ли он азы языка программирования. Эта статья — для тех, кто только начинает свой путь в PHP. Неважно, пишете ли вы первые строки кода на курсах, пробуете себя на фрилансе или хотите пройти собеседование — вы должны знать базовые вещи: как создаются переменные, как работает if, while, массивы и функции.
Чтобы сделать материал живым, я взяла настоящий тест начального уровня по PHP. В нём — типичные вопросы, с которыми сталкиваются новички. В этой статье мы разберем каждый вопрос пошагово. Я объясню, что спрашивают, почему правильный ответ — именно он, и какие ошибки часто допускают начинающие. Всё на простом языке. Даже мама поймёт, что делает оператор isset() и зачем в foreach нужен as.
Вопрос 1. Какой из перечисленных операторов присваивания НЕ поддерживается в PHP?
Чтобы ответить правильно, давай посмотрим на каждый вариант:
- Вариант 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. Какой результат выведет следующий код?
В PHP есть два типа операторов сравнения:
- == — нестрогое сравнение, при котором PHP пытается привести типы. То есть 50 == "50" даст true.
- === — строгое сравнение, при котором PHP не только сравнивает значения, но и проверяет, совпадают ли типы.
В данном коде используется строгое сравнение (===).
А теперь смотрим:
Значения у них одинаковые, но типы разные.
А === в PHP говорит: "Я хочу, чтобы и тип, и значение были точно такими же."
Поскольку типы не совпадают, выражение $x === $y будет false.
Значит, выполнится блок else и на экран выведется:
Представь, что ты ищешь одинаковые коробки.
Ты видишь две коробки, на обеих написано «50». Одна — из дерева, другая — из бумаги. Вроде бы одинаковые, но ты сравниваешь не только цифру на коробке, но и материал.
Вот это и есть строгое сравнение в PHP: он смотрит не только, что там «50», но и какой тип — дерево или бумага (число или строка).
А тут — материалы разные. Поэтому — не совпадают.
Вопрос 3. В каком из этих вариантов после выполнения кода значение переменной $a в global scope будет равно 6?
Суть: нужно понять, какой из кодов действительно изменяет значение глобальной переменной $a — то есть не внутри функции, а снаружи, чтобы после выполнения sum($a) в основной области видимости переменная $a стала равна 6.
function sum(&$a){ return $a + 1; }
- Функция получает аргумент по ссылке (&$a) — это уже хорошо.
- Но внутри функции мы не меняем значение переменной, а просто возвращаем $a + 1, не присваивая это обратно в $a.
👉$a останется 5, потому что мы её не тронули — просто посчитали, но не записали. Несмотря на то, что он не меняет значение, он хотя бы передаёт по ссылке, и достаточно добавить $a = $a + 1;, чтобы всё заработало.
function sum($a){ return $a + 1; }
- Аргумент передаётся по значению (копия), и никакие изменения не влияют на глобальную $a.
- Даже если бы мы что-то меняли — это была бы локальная переменная.
function sum($a){ return $a++; }
- Передача по значению.
- return $a++ — возвращает текущее значение $a, а затем увеличивает, но снова — только копию.
👉 Глобальная $a никак не изменится. Будет 5.
function sum($a){ return $a + 2; }
function sum(%$a){ return $a + 1; }
function sum(&$a){ return $a + 1; }
Вопрос 4. Как в PHP можно создать массив?
В PHP массивы можно создавать двумя основными способами:
1. Через функцию array() — старый, но до сих пор рабочий способ:
$a = array(1, 'b' => 2, '1' => 3);
2. Через квадратные скобки [] — современный и лаконичный:
PHP позволяет использовать как числовые, так и строковые ключи. Строка '1' будет интерпретироваться как число 1, если ключ числовой, но это допустимо в синтаксисе.
Ошибка синтаксиса. Скобки () не используются для создания массивов — они применяются в кортежах в других языках, но не в PHP.
Это синтаксис JavaScript-объекта, а не PHP. PHP не использует {} для создания массивов, и кавычки типа “ ” недопустимы.
Форма почти верная, но…
Ошибка! В PHP в array() должен быть =>, а не : для пар "ключ => значение".
Современный, корректный способ создания массива.
Первый элемент имеет индекс 0, дальше — 'b' и '1'. Всё допустимо.
На первый взгляд, выглядит нормально, но переменная 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");
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 ничего не будет добавлено.
Не требуется одинаковый размер для +. PHP не проверяет размер массивов.
« . » — это оператор конкатенации строк, а не массивов. Это ошибка.
while не обязателен. Можно использовать foreach или print_r, это не корень проблемы.
+ действительно работает с массивами, просто не даёт ожидаемого результата (не заменяет дубликаты). Но он не вызывает ошибку, а echo — вызывает.
Функция echo не может вывести массив напрямую. Нужно использовать print_r($result) или var_dump($result).
Ты кладёшь коробку с предметами (массив) в другую коробку (переменную $result), а потом говоришь: «Скажи мне, что там».
Но говоришь обычной фразой: echo коробка.
А PHP отвечает: «Я не умею просто сказать коробку — мне нужно в неё заглянуть!»
И вот тут нужен print_r(), который умеет заглядывать внутрь.
5. Функция echo не может вывести массив, нужно использовать print_r($result).
Вопрос 7. Посмотрите код и определите результат выполнения вывода программы.
- $text = "Hello world" — длина строки: 11 символов
- substr($text, 5, 10) — означает:
→ начать с позиции 5 (отсчёт с нуля)
→ взять 10 символов
От позиции 5 включительно (пробел) считаем 10 символов:
(всего до конца строки — 6 символов, так что вернётся всё, что осталось).
“ world” (с пробелом в начале, без кавычек).
Вопрос 8. Пользователь заполнил форму, в которой было поле:
<input type="text" id="username" name="login">
Выберите код, который вы будете использовать для проверки наличия переменной, отправленной методом POST.
Цель: проверить, была ли отправлена переменная login через POST.
- Неправильное имя суперглобальной переменной: должно быть $_POST, а не $POST.
- $login не определён — будет ошибка.
- $_POST — массив, содержащий все данные, переданные через POST.
- 'login' — ключ, соответствующий атрибуту name="login".
Функции exists() не существует в PHP.
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. Не используется подавление ошибок с @.
$mysqli = new mysqli('db.local', 'user', 'pass', 'my_database');
$mysqli->set_charset('utf8mb4');
$mysqli = new mysqli('db.local', 'user', 'pass', 'my_database');
die("Connection failed: " . $mysqli->connect_error);
$mysqli->set_charset('utf8mb4');
- Используется современный интерфейс mysqli.
- Присутствует обработка ошибки подключения.
- Устанавливается utf8mb4 через set_charset() — рекомендуемый способ.
👉 Полностью соответствует современным рекомендациям.
$mysqli = @mysqli_connect('db.local', 'user', 'pass', 'my_database');
$mysqli->query("SET NAMES 'utf8mb4'");
- Использует устаревшую функцию mysqli_connect().
- Подавление ошибок через @ — плохая практика.
- Установка кодировки через SQL — допустимо, но менее предпочтительно, чем set_charset().
👉 Нарушает несколько рекомендаций.
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->real_connect('db.local', 'user', 'pass', 'my_database');
$mysqli->query("SET CHARACTER SET utf8");
👉 Частично правильно, но не устанавливается нужная кодировка.
Вариант 2 — с обработкой connect_error и установкой utf8mb4 через set_charset()
Соответствует требованиям безопасности и актуальным рекомендациям.
Вопрос 10.
В проекте используется MySQLi, поэтому для работы с БД мы можем применять только её.
Какой запрос нужно использовать в коде ниже, чтобы получить все данные из таблицы users?
$mysqli = new mysqli("localhost", "myuser", "mypass", "mydb");
$result = $mysqli->query("___");
Цель: найти корректный SQL-запрос, чтобы получить все строки и все столбцы из таблицы users.
Вариант 2: SELECT username FROM users
SELECT *, CONCAT(first_name, ' ', last_name) AS full_name FROM users
- Расширенный запрос: получает все поля *, плюс создаёт новое поле full_name.
- Это работает, но это больше, чем требуется по условию (не "все данные как есть").
Формально правильно, но избыточно.
Вариант 4: FETCH ALL_DATA FROM users
Вариант 5: SELECT * FROM users
Полностью соответствует требованию. Верно.
Если таблица — это Excel, а строки — это записи о людях,
то SELECT * FROM users — это сказать базе:
«Покажи мне всю таблицу полностью, без фильтров и ограничений».
Заключение.
Если вы поняли, как работают переменные, управляющие конструкции и функции, вы уже сделали большой шаг вперёд. Именно на таких простых задачах строится основа любого реального проекта. А значит, вы уже можете писать скрипты для сайта, обрабатывать формы, работать с простыми массивами. Следующий шаг — научиться взаимодействовать с базами данных и избегать ошибок, связанных с безопасностью. А это уже тема следующего уровня — средней сложности, о котором расскажу в следующей статье.