Вопросы с собеседований и экзаменов по PHP

Вопросы и задачи с собеседований и экзаменов по PHP

перейти к содержанию задачника

  1. Создать скрипт, который в папке /datafiles найдет все файлы, имена которых состоят из цифр и букв латинского алфавита, имеют расширение ixt и выведет на экран имена этих файлов, упорядоченных по имени.Задание должно быть выполнено с использованием регулярных выражений.
    Весь код должен быть прокомментирован в стиле PHPDocumentor’а.
  2. Чему будет равен $x после выполнения выражения $x = 3 + “15%” + “$25”?
  3. Параллельные вычисления (реальное тестовое задание от www.interesnee.ru)
    Суть задачи: Требуется написать класс (семейство классов), позволяющий реализовывать параллельные вычисления на РНР.Объяснение сути задачи:
    С помощью данного класса или системы классов становится возможным запускать php скрипты или их части в отдельных процессах. Причём взаимодествие между процессами осуществляется также посредством разработанных классов. При этом под процессом понимается каждый запущеный экземпляр php скрипта.Обязательные требования к скрипту:

    • Весь код должен быть написан в OOП стиле, т.е. с использованием классов, интерфейсов, исключений и т.д.
    • Весь код должен быть прокомментирован в стиле PHPDocumentor’a.
    • Скрипт должен функционировать как в Windows так и в Unix системах.
    • Должна быть возможность распараллеливать не только скрипт целиком, но и конкретную функцию или метод класса.
    • Скрипт запускающий параллельные процессы должен иметь возможность общаться с ними в обоих направлениях. А именно: отправлять данные в дочерние процессы в любое время, получать данные с любого из дочерних процессов в любое время, определять статус процесса (работает, не работает). Дочерние скрипты также могут отправлять данные в порождающий процесс в произвольное время.

    Тестовый пример:
    Испытать ваш класс (классы) для распараллеливания предлагается на следующем примере: вычисление числа pi с заданной точностью методом монте карло (см. википедию). Порождающий скрипт запускает несколько дочерних процессов (количество процессов должно быть параметром конфига), каждый из которых начинает вычислять число pi методом монте карло. При этом при запуске параллельного процесса ему должно быть передано количество итераций вычислений, определяемое случайным образом. Порождающий скрипт через неравные промежутки времени (определяемые так же случайно) должен собирать информацию со всех параллельных процессов и выдавать совокупный результат (значение числа pi) в браузер с указанием времени прошедшей с момента запуска главного скрипта.
    Как будет оцениваться ваш тест:

    • Исполняемость и соответствие логики работы скрипта заданию. Если ваш скрипт не реализует распараллеливание процессов, или, в принципе, не может быть исполнен из-за каких-то синтаксических проблем в коде (код либо недописан, либо имеет ошибки синтаксиса), то тестовое задание будет считаться проваленным.
    • Наличие выполненых обязательных требований к скрипту. Если какое-то из обязательных требований не будет выполнено, то это ещё не значит что вы не пройдёте тест. Однако чем больше обязательных требований будет реализовано тем выше вероятность успеха.
  4. $x = 1;
    if ($x == ‘1’) { echo ‘a’; }
    if ($x == true) { echo ‘b’; }
    if((bool)$x === true){ echo ‘e’; }
    if ($x === true) {  echo ‘c’; }
    if((int)$x === true){ echo ‘d’; }
    Какая строчка выведется при исполнении скрипта?
    Почему исполняется или не исполняется каждое из условий?
  5. Напиши письмо с решением тестового задания на Python + PHP (если не знаешь, можно выучить по докам):
    на вход шаблон аля “ws[10-14].yandex.net”, на выход массив [“ws10.yandex.net”, …, “ws14.yandex.net”]И опиши свою стратегию решения насущной задачи: как фильтровать левые заявки на кредиты до получки. Неизвестные моменты ищутся в гугле.И напиши как ты пришел в профессию.
  6. Напишите на PHP функцию разбора SMS с кодом подтверждения от сервиса Яндекс.Деньги. Функция должна принимать текстовую строку и возвращать код подтверждения, сумму и кошелек. Речь идет о реальном сервисе Яндекс.Деньги. Если у вас нет кошелька, то воспользуйтесь эмулятором, генерирующим идентичные сообщения. Учтите, что порядок полей, пунктуация и слова со временем могут быть изменены.
  7. Напишите функцию на JavaScript с использованием jQuery, которая принимает URL, делает GET-запрос на сервер и отображает ответ (или ошибку) в модальном окне Bootstrap. Окно должно открываться при вызове функции без какой-либо задержки. Ответ содержит произвольный HTML-код, не требующий дополнительной обработки.
  8. Что нужно сделать:- Выполнить тестовое задание: “Написать скрипт, который можно запустить из командной строки, принимающий последовательность символов, разделенных запятой, и определяющий является ли введенная последовательность прогрессией. Решение выложить в публичный репозиторий”
  9. Тестовое задание:Сделать форму для ввода числа и отправки ее на сервер, где PHP скрипт проверяет, входит ли данное число в диапазон от 1000 до 2000 и затем возвращает его пользователю в таком виде (число, разбитое на разряды + расшифровка словами):
    “1 853 – две тысячи восемьсот пятьдесят три – входит в диапазон”
    “4 654 187 – четыре миллиона шестьсот пятьдесят четыре тысячи сто восемьдесят семь – не входит в диапазон”
    Все введенные данные сохранять в MySQL в виде отдельных записей. При каждом обновлении формы выводить на странице количество вошедших и не вошедших в диапазон чисел за все время работы формы.Результат прислать в виде одного PHP-файла и файла-дампа таблицы, с которой работает скрипт.По результатам реализации будет принято решение. Желаем удачи и ждем Вас в нашей команде!
    Спасибо.
  10. Тестовое задание. 1) Сделать форму обратной связи.
    На странице должны быть показаны все оставленные отзывы, под ними форма: Имя, E-mail, текст сообщения, кнопки “Предварительный просмотр” и “Отправить”.
    Отзывы можно сортировать по имени автора, e-mail и дате добавления (по умолчанию – по дате, последние наверху).Также должна быть валидация.
    2) Предварительный просмотр должен работать без перезагрузки страницы.
    3) Сделать вход для администратора (логин “admin”, пароль “123”). Администратор должен иметь возможность редактировать отзыв. Измененные отзывы в общем списке выводятся с пометкой “изменен администратором”.
    4) К отзыву можно прикрепить картинку.
    Картинка должна быть не более 320х240 пикселей, при попытке залить изображение большего размера, картинка должна быть пропорционально уменьшена до заданных размеров. Допустимые форматы: JPG, GIF, PNG.
    5) У администратора должна быть возможность модерирования.
    Т.е. на странице администратора показаны отзывы с миниатюрами картинок и их статусы (принят/отклонен).
    Отзыв становится видимым для всех только после принятия админом. Отклоненные отзывы остаются в базе, но не показываются обычным пользователям. Изменение картинки администратором не требуется.В приложении нужно с помощью чистого PHP реализовать модель MVC (PHP-фреймворки использовать нельзя).
    Верстка на bootstrap. Помните, что аккуратность – это один из главных критериев оценки тестового.Приложение нужно развернуть на любом бесплатном хостинге, чтобы можно было посмотреть его в действии.
  11. Тестовое задание с freelance.ru (видимо, заказчик устраивался на работу junior-ом)
    1. Создать простое API по управлению пользователями (обращение к API через POST и GET запросы)

    Типы пользователей:

    – Суперадмин (может добавлять/изменять/удалять любой тип пользователей кроме супер администраторов) задан в системе по умолчанию

    – Администратор (может добавлять/изменять/удалять простых пользователей)

    – Пользователь (может просматривать информацию о себе) (Имя, Возраст)

     

    Авторизация для работы с API на своё усмотрение.

    Информация должна храниться в MySql

    Код необходимо написать с нуля без использования готовых фреймворков.

    PHP 5.6 и выше

     

    1. Есть таблица tree, содержащая записи следующего вида:

     

    node_id parent_id title
    1 null Node 1
    2 1 Node 2
    3 2 Node 3
    4 2 Node 4
    5 null Node 5

     

    1. Напишите скрипт, который построит древовидную иерархию в виде многомерного массива.

     

    Имеется таблица ticks вида:

     

    id symbol date value
    1 EURUSD 2014-01-10 1.34
    2 GBPUSD 2014-01-10 1.67
    50 EURUSD 2014-01-09 1.31
    51 NZDUSD 2014-01-09 0.83

     

    В таблице содержатся данные со значениями валютных пар в разные даты. Набор валютных пар ограничен – предположим, что их около 50 штук. Данные в таблице обновляются каждый день, но может случиться так, что  в какой-то из дней нет данных по некоторым валютным парам. Необходимо написать запрос, который получит самые «свежие» значения по каждой валютной паре. Если за текущий день значения по какой-то из валютных пар отсутствует, то необходимо выбрать предыдущее значение, и т.д. В результате должна получиться таблица вида:

     

    EURUSD 1.34
    GBPUSD 1.67
    NZDUSD 0.83

     

  12. Тестовое задания на WordPress для junior Поднять чистый WP.
    Установить плагин “SimpleFields” (https://wordpress.org/plugins/simple-fields/) (документация: simple-fields.com/documentation/).
    Написать собственный плагин, который инициализирует новый post-type “Объект недвижимости” и taxonomy “Район”, где объект недвижимости будет зданием (в здании может быть множество квартир или помещений).
    Через “SimpleFields” создать набор полей для объектов недвижимости: “название дома (input)”, “координаты местонахождения (input)”, “количество этажей (1-20, list)”, “тип строения (панель/кирпич/пеноблок, radio)”, “изображение”, мульти-блок-полей “помещение” где будут такие поля как “площадь (input)”, “кол.комнат (1-10, radio)”, “балкон (да/нет, radio)”, “санузел (да/нет, radio)”, “изображение”.
    В single-page здания должны выводиться все эти заполненные аттрибуты и прочее.
    В плагине добавить инициализацию shortcode и widget, который при вставке на фронте должен отобразить блок фильтра (со всем полями) по объектам недвижимости и их помещений. При операции поиска ниже блока фильтра средствами Ajax должен выводиться список из 10 найденных позиций с постраничным выводом. Каждая позиция может быть как зданием или помещением с изображением, заголовком и коротким описанием, с сcылкой перехода на страницу здания.
  13. Разработать мини-сайт на современном фреймворке под PHP7. Верстка – Twitter Bootstrap. Фронтенд: главная (html-страница), лента новостей, просмотр одной новости, галерея картинок с просмотром через lightbox. Бэкэнд: авторизация (не htaccess), редактор текста на главной (WYSIWYG -редактор), редактор статей (заголовок, картинка, текст), реактор галереи (добавление и удаление изображений, автокроп изображений под 800х600 с сохранением соотношения сторон).Будет оцениваться: стиль кода, комментирование, алгоритмы, понимание фреймворка. Дизайн оцениваться не будет, однако отвращения он тоже вызывать не должен. После первой сдачи будут даны комментарии и вопросы, ответы на которые также будут оценены.
  14. Тестовое задание (php+mysql)
    • Создать структуру базы данных для хранения иерархического списка.
    • Произвольный текст на русском языке (например, с сайта https://yandex.ru/referats/) разбить на слова.
    • Создать из этих слов дерево с тремя уровнями вложенности: первая буква в слове – первый уровень, вторая буква в слове – второй уровень, третья буква в слове – третий уровень, все слово – четвертый уровень и записать иерархию в базу.
    • Вывести все дерево на странице.

     

  15. С помощью PHP и MySQL (можно использовать фреймворк или CMS):
    • Форма для входа и проверки логина и пароля.
    • После проверки пароля предоставить интерфейс для загрузки картинок на сервер с возможностью удаления файлов.
  16. Задача по Laravel c форума laravel.ru   Будем считать, что директория . корень проекта Laravel 5.4Для Laravel 5.4 написать сервис, отдельным модулем,
    который возможно проинсталлировать через composer из локальной директории в vendor из дериктории ../vendor/objectsПри публикации сервиса через artisan vendor: publish в дериктории конфигураций laravel должен создаться конфиг objects.phpСервис должен быть доступен через алиас “Objects” фасада сервиса
    Сервис имеет метод make – возвращающий объекты типа класса из конфига objects.phpВ конфиг objects.php будут вноситься различные значения ‘{Наименование}” => [class => ‘{Класс}’, age => {Возраст}], например ‘Dog’ => [‘class’ => \Examples\Dogs::class, ‘age’ => 7 ], ‘Cat’ => [‘class’ => \Examples\Cats::class, ‘age’ => 3 ],
    где все классы обязаны иметь методы age() возвращающие соответствующее значение из age – конфига в соответствии с классом, и class() возвращающие строку с наименованием класса объекта в котором вызванСервис не может создать объект, у класса которого отсутствуют обязательные методы.
    Если запросить не существующий в конфиге класс, должно быть брошено исключение класса \Examples\ObjectsMakeException::classТесты в php artisan tinker:$dog = Objects::make(‘Dog’); \\$dog объект класса \Examples\Dogs
    $dog->age(); \\Должен вернуть 7
    Objects::make(‘Cat’)->age(); \\Должен вернуть 3
    Objects::make(‘Cat’)->class(); \\Должен вернуть (String) ‘\Examples\Cats’Objects::make(‘Human’); // ObjectsMakeException
  17. Вопросы из вакансии для стажера: 1. Напишите код на PHP для решения задачи.Есть отсортированный по возрастанию массив из 1000 элементов. Есть число, которое точно есть в этом массиве. Выведите на экран его порядковый номер.
    Функции поиска элемента в массиве не используйте, напишите цикл.2. Решите задачуВ стакане размножаются амебы. Амебы размножаются делением на две. Деление происходит 1 раз в секунду. Если в пустой стакан посадить одну амебу, то он заполнится амебами через 1 минуту. Через какое время пустой стакан будет заполнен амебами, если посадить туда сразу две амебы?
    Почему?3. Что делает этот sql-запрос? Объясните по-русскиselect count(*) from users inner join orders on users.id=orders.id_user where users.age<194*. Интерфейс добавления и просмотра данныхВ таблице базы данных хранятся страны. Напишите на html, css, js, php интерфейс добавления новой страны в таблицу и просмотра списка стран из таблицы.Структуру таблицы придумайте самостоятельно. Удаление и редактирование делать не нужно.Обратите внимание, мы принимаем только хорошие решения этой задачи.Хорошее решение – это:защита от инъекций при получении параметров через get- или post;
    защита от опасного текста, вводимого пользователем;
    осмысленное название полей и таблицы базы данных;
    разумное оформление кода – имена переменных, функций, отступы, комментарии; код должен быть прост в поддержке;
    отсутствие дублирование кода; копипаст – признак низкой культуры разработки;
    запускаемость в linux-средах без танцев с бубнами (регистр имен файлов, относительные пути);
    разделение логики работы и представления – некрасиво писать html и php вперемешку;
    осмысленное использование css и хотя бы немного на js.
    HTML- и CSS-фреймворки использовать можно. PHP-код надо написать с нуля.Это задание не нужно решать “как попало”. Оно очень простое, но сделать нужно хорошо. Критерий качества решения — защищенность, надежность, простота реализации.
  18. 200 функций. В одной вакансии встретил требование: знать как минимум 200 функций из списка.
  19. Прокомментируйте код if ($user = User::first() && $comment = Comment::first()) { … }. Есть ли ошибка в нем?
  20. Тестовое задание

    Реализовать простой протокол JSON-API для мобильного приложения.Чтобы лучше понять Ваши навыки программирования и проектирования, решить задачу предлагается на чистом PHP, без использования фреймворков, но с использованием ООП. Код должен быть аккуратен, без излишних усложнений.

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

    Предполагается, что сервер будет работать под управлением Ubuntu, PHP 7.1, MySQL, Nginx. Дополнительные библиотеки, при необходимости, будут доступны.

    Описание протокола

    Запрос

    Вызов методов происходит путем отправки POST запроса на URL вида: http://server/api/MethodName

    Ответ

    Ответ присылается всегда в JSON формате (даже в случае ошибки) и всегда имеет следующий вид: { status: "ok", payload: {}, message: "" }

    Описание полей ответа

    • status – Cтатус операции (“ok” | “error” – ошибка или успех)
    • payload – Полезная нагрузка (данные) – массив объектов или сам объект
    • message – Опциональный параметр – сообщение, которое нужно отобразить пользователю. Например, “Спасибо, ваша новость сохранена” или “Вы уже опубликовали такую новость”.

    Методы

    Метод “Table”

    Получить данные таблицы. Метод возвращает все имеющиеся данные для указанной таблицы (из числа разрешенных). Важно: количество доступных таблиц в дальнейшем планируется значительно увеличить.

    Параметры запроса

    • table – название таблицы (обязательный параметр). На текущий момент разрешены следующие значения:News, Session
    • id – ID объекта (опциональный параметр). Если не передан – возвращаются все объекты таблицы, если передан – возвращается единственная строка с указанным ID.

    Пример ответа (таблица News)

    { "status": "ok", "payload": [ { "ID": 1, "ParticipantId": 1, "NewsTitle": "Доступна новая программа", "NewsMessage": "Новая программа выслана на почту всем участникам" "LikesCounter": 0 }, { "ID": 2, "ParticipantId": 3, "NewsTitle": "Еще одна новость", "NewsMessage": "Проверка новости" "LikesCounter": 0 } ] }

    Пример ответа (таблица Session)

    { "status": "ok", "payload": [ { "ID": 123, "Name": "Annual report", "TimeOfEvent": "2016-12-15 16:00:00", "Description": "Anuual report by CEO", "Speakers": [ { "ID": 1, "Name": "Speaker name } ] } ] }

    Метод SessionSubscribe

    Записаться на сессию (лекцию). Каждая сессия имеет ограниченное число мест. Записаться может только пользователь, который есть в таблице Users. Важно: посещаемость сервиса будет высокая, не должно быть возможности превысить число записавшихся.

    Параметры запроса

    • sessionId – ID сессии, на которую нужно записаться
    • userEmail – email пользователя

    Пример ответа

    { "status": "ok", "message": "Спасибо, вы успешно записаны!" }

    Пример ответа (ошибка)

    { "status": "ok", "message": "Извините, все места заняты" }

  1. Квалификационный тест на соискание должности веб-разработчикаHTML и CSS1. Имеется следующая HTML-разметка страницы и изображение logo.gif:

    Необходимо с помощью каскадных таблиц стилей сделать, чтобы этот блок (div) находился по центру окна браузера, имел фиксированный размер 300×300px, изображение (logo.gif) было выровнено по центру блока, а текст в блоке — по левому краю.

    2. Заверстать форму авторизации — поля «Логин», «Пароль», ссылка для восстановления пароля, кнопка «Вход». Предложенная верстка должна позволять максимально гибко изменять внешний вид формы с использованием таблиц стилей.

    3. Есть ссылка, при нажатии на которую пользователю в новом окне должна отображаться схема проезда.

    Расскажите, почему не стоит использовать ссылки подобным образом? Приведите аргументы. Каким образом можно исправить ситуацию.

    JavaScript

    1. Расширить объект Array, реализовав метод, который будет определять, находится ли искомая величина в массиве.

    2. Определить, почему данный код приведет к ошибке. Как эту ошибку исправить?

    PHP

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

    2. Написать результат и состояние массива на каждом шаге выполнения программы.

    3. Каков будет результат работы этой программы. Напишите последовательность вызова конструкторов.

    4. Что такое «интерфейс» в ООП. Зачем они нужны?

    5. Шаблоны проектирования. Что это такое? Описать несколько.

    SQL (MySQL)

    1. Есть таблица в которой две колонки: сотрудник и его должность.

    Таблица employers
    employee post

    Составить запрос который выведет список должностей, на которых числится более 10 сотрудников

    2. Рассказать, как вы будете хранить и получать связанные N:N сущности и почему. Приведите примеры запросов.

  2. Создать одностраничный сайт todo-листа.По центру сайта, шириной 600px. поле ввода задачи, кнопку добавления, внизу список задач.Добавлять запись и обновлять список аяксом.У каждой задачи рабочая кнопка удаления.Бэкенд – php+ mysql.Таблицы: tasks, log (записывать ip, время и id таска)
  3. Тестовое задание (компания StudyQA)

    Сделать простой сайт на Laravel, состоящий из следующих разделов:

    1. Главная страница – просто текст
    2. Новости
      1. Список новостей
      2. Страница детального просмотра новости
    3. Галерея – просто ряд картинок с возможностью их увеличить

    Требования к фронтенду:

    Bootstrap 4 + jQuery

    Требования к бэкенду:

    Сайт должен быть построен на фреймворке Laravel. В качестве БД необходимо использовать MySQL. Должна быть возможность редактировать текст на главной, управлять новостными записями, загружать картинки в галерею.

    PHPDoc и простейшие unit-тесты приветствуются.

    Результат работы необходимо представить в виде репозитория на github/bitbucket/др.

  4. Тестовое задание от tapitinc.com Для участия в собеседовании Вам необходимо решить “головоломку”.
    Она состоит из нескольких этапов, на каждом из которых вы будете получать очередной код(решение) для перехода на следующий этап.

    Задание “головоломки”

    Q09ERTogODI0Niwgc3VibWl0IHRvOiBodHRwczovL3hzdGVjaC5ldS 9zdWJtaXQtY29kZQoKV2Uga25vdyB0aGF0IGl0IHdhcyB2ZXJ5IHNp bXBsZSwgYnV0IGl0IGlzIG9ubHkgdGhlIGJlZ2lubmluZyEgOyk=

  5. Тестовое задание на должность junior php программист (от ylab)
  6. Тестовое задание 2 от studyqa

    Реализовать главную страницу с произвольным контентом – текст + картинки. При клике на картинку, она отображается в увеличенном виде во всплывающем окне (достаточно прикрутить любую jQuery-библиотеку). В панели администрирования суперадминистратор должен иметь возможность редактировать контент главной страницы

    Реализовать 2 страницы с формами “заявок”, включающими поля (имя, фамилия, телефон, емейл, уровень образования), и рандомным контентом (текст-рыба + картинки, видео, что угодно).
    Форма отправляется ajax-запросом. После обработки формы следует выводить сообщение о результате успешно/не успешно. Например, можно выводить блок c соответствующим сообщением.
    Уровень образования представляет собой дропдаун со следующими вариантами: Bachelor, Master, PhD. Все поля обязательны к заполнению, для валидации на фронтэнде использовать стандартную HTML 5 валидацию.
    Каждая из этих страниц предназначена для разных “клиентов” (т.е. например, это заявки на участие в мероприятии A и мероприятии B).
    Заявки пользователей сохранять в отдельные таблицы в БД.
    Также следует сохранять ip, с которого совершена заявка и utm-метки (достаточно просто сохранить весь хвост get-запроса).
    После заполнения заявки пользователю приходит письмо на почту с текстом вроде “Спасибо, что зарегистрировались на наше мероприятие. Бла-бла-бла”. Представителям мероприятия приходит письмо с текстом “у вас новая заявка” и данными заполненной формы. Формы отправляются через очереди в Laravel.
    Реализовать раздел административной панели, в котором будет доступен список заявок, а суперадминистраторы имеют возможность удалять существующие заявки. IP автора заявки и utm метки видны только суперадминистратору.
    Пользователь с правами организатора мероприятия A не может видеть заявки мероприятия B, а представитель мероприятия B не может видеть заявки на мероприятие A.

    Требования к фронтэнду:
    Bootstrap 4 + jQuery

    Требования к бэкенду:
    PHP 7.1+
    Laravel 5.5+
    MySQL 5.7

    PHPDoc и простейшие unit-тесты приветствуются.

    Результат
    Результат работы необходимо представить в виде репозитория на github/bitbucket/др