Pull to refresh

Junior PHP. Ответы на часто задаваемые вопросы на технических собеседованиях

Level of difficultyEasy
Reading time14 min
Views13K

Привет пользователям Хабра!

Тема собеседований и подготовки к ним всегда актуальна. Поэтому подготовил ответы на часто задаваемые вопросы на технических собесах по PHP на уровень Junior. Сразу скажу, что этот список вопросов я взял с другого ресурса, к которому очень часто обращаются собеседующие, которые не хотят утруждать себя сочинением своих вопросов. Но в целом повторить базу перед предстоящим собеседованием будет никому не лишним.

Эта статья будет полезна, всем тем, кто хочет быстро повторить теорию по языку. Если есть желание погрузиться в контекст, в статье будут ссылки на документацию PHP с более подробной информацией.

Это первая статья из будущего цикла ответов на вопросы. Буду выкладывать по мере готовности в своем телеграмм-канале и конечно же тут. Подпишитесь везде, чтобы не пропустить.

Собственно переходим к списку:

1. Что такое ссылки?

Ссылки в PHP - это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели C; например, вы не можете выполнять над ними адресную арифметику, они не являются реальными адресами в памяти и т.д. Для получения дополнительной информации смотрите Чем ссылки не являются. Вместо этого указатели в PHP - это псевдонимы в таблице имён переменных. В PHP имя переменной и её содержимое - это разные вещи, поэтому одно содержимое может иметь разные имена. Можно провести аналогию с именами файлов и файлами в Unix: имена переменных - записи в каталоге, а содержимое переменной - это сам файл. Ссылки в PHP - аналог жёстких ссылок в файловых системах Unix.

2. Каковы основные операции с использованием ссылок?

Есть три основных операции с использованием ссылок: присвоение по ссылкепередача по ссылке и возврат по ссылке.

3. Назовите простые типы данных, поддерживаемые в РНР.

Скалярные:

Специальные

4. Что такое инкремент и декремент, в чем разница между префиксным и постфиксным инкрементом и декрементом?

  • Декремент - уменьшает значение переменной на единицу

  • Инкремент - увеличивает значение переменной на единицу

При использовании префиксной нотации сначала происходит изменение переменной, а потом — возврат. При использовании постфиксной нотации — наоборот: сначала возврат, а потом изменение переменной.

5. Что такое рекурсия?

Функция, которая вызывает саму себя

6. В чем разница между =, == и ===?

  • = - оператор присвоения

  • == - оператор определяет нестрогое сравнение

  • === - оператор строгого сравнение. Эквивалентное сравнение (типы переменных и их значения должны строго совпадать)

7. Какие знаете принципы ООП?

  • Инкапсуляция. Скрытие внутреннего состояния и функций объекта и предоставление доступа только через открытый набор функций

  • Наследование. Возможность создания новых абстракций на основе существующих

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

Часть авторов так же выделяют и четвертый принцип:

  • Абстракция. Моделирование требуемых атрибутов и взаимодействий сущностей в виде классов для определения абстрактного представления системы

8. Какая система типов используется в PHP? Опишите плюсы и минусы.

Используется динамическая система типов. При отсутствии типизации кода, интерпретатор сам определяет тип данных переменных, исходя их контекста.

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

9. Чем отличаются ключевые слова: include и require?

В PHP ключевые слова include и require используются для включения содержимого другого файла в текущий скрипт. Оба оператора выполняют похожую функцию, но есть разница в их поведении в случае ошибок.

include:

  • Если при использовании include не удается найти указанный файл, PHP генерирует предупреждение, но выполнение скрипта продолжается.

  • include используется, когда вы хотите, чтобы выполнение скрипта продолжалось даже при отсутствии включаемого файла.

require:

  • Если при использовании require не удается найти указанный файл, PHP генерирует фатальную ошибку и останавливает выполнение скрипта.

  • require используется, когда включаемый файл считается критическим для работы программы, и его отсутствие должно привести к завершению выполнения скрипта.

10. Что такое интерфейсы? Используете ли вы их? Если да — расскажите об этом.

Это абстрактный тип данных, предназначенный для определения методов, которые класс должен реализовать. Интерфейс содержит только объявления методов без их тела. Класс, который реализует интерфейс, обязан предоставить реализации всех методов, объявленных в интерфейсе.

11. Что такое абстрактный класс и чем он отличается от интерфейса?

Абстрактный класс в отличии от интерфейса может иметь как методы с реализацией, так и абстрактные методы (методы без реализации), однако, не может быть инстанциирован (т.е., создан как объект).

12. Может ли абстрактный класс содержать приватный метод?

Да, если это не абстрактный метод.

13. Какие модификаторы видимости есть в РНР?

private, protected, public

14. Какие магические методы вы знаете и как их применяют?

Магические методы - это специальные методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются определённые действия.

Следующие названия методов считаются магическими:  __construct(),  __destruct(),  __call(),  __callStatic(),  __get()__set(),  __isset(),  __unset(),  __sleep(),  __wakeup()__serialize()__unserialize(),  __toString()__invoke()__set_state()__clone() и __debugInfo()

15. Что такое генераторы и как их использовать?

Генераторы предоставляют лёгкий способ реализации простых итераторов без использования дополнительных ресурсов или сложностей, связанных с реализацией класса, реализующего интерфейс Iterator.

Генератор позволяет вам писать код, использующий foreach для перебора набора данных без необходимости создания массива в памяти, что может привести к превышению лимита памяти, либо потребует довольно много времени для его создания. Вместо этого, вы можете написать функцию-генератор, которая, по сути, является обычной функцией, за исключением того, что вместо возврата единственного значения, генератор может возвращать (yield) столько раз, сколько необходимо для генерации значений, позволяющих перебрать исходный набор данных.

16. Что делает оператор yield?

Вся суть генератора заключается в ключевом слове yield. В самом простом варианте оператор "yield" можно рассматривать как оператор "return", за исключением того, что вместо прекращения работы функции, "yield" только приостанавливает её выполнение и возвращает текущее значение, и при следующем вызове функции она возобновит выполнение с места, на котором прервалась.

17. Что такое traits? Альтернативное решение? Приведите пример.

Трейт — это механизм переиспользования кода в языках с поддержкой одиночного наследования, к которым относится PHP. Задача трейта — уменьшить ограничения одиночного наследования, разрешая разработчику легко переиспользовать наборы методов в нескольких независимых классах, находящихся в разных иерархиях классов. Семантика комбинации трейтов и классов определена так, чтобы снизить уровень сложности, а также избежать типичных проблем, свойственных множественному наследованию и примесям (Mixins).

Трейт очень похож на класс, но рассчитан только на группировку функциональности тонко контролируемым и согласованным образом. Нельзя создать отдельный экземляр трейта. Трейт — это дополнение к обычному наследованию и инструмент построения горизонтальной композиции поведения, то есть работы с членами класса (трейта) без требования наследования.

Альтернативой применению трейта является композиция.

18. Опишите поведение при использовании traits с одинаковыми именами полей и / или методов.

Если два трейта добавляют метод с одним и тем же именем, будет вызвана фатальная ошибка, если конфликт явно не разрешён.

Для разрешения конфликтов именования между трейтами, включёнными в один и тот же класс, вызывают оператор insteadof, чтобы точно выбрать один из конфликтующих методов.

Так как предыдущий оператор только исключает методы, оператор as может включить один из конфликтующих методов под другим именем. Обратите внимание, что оператор as не переименовывает метод, а также не влияет ни на какой другой метод.

19. Будут ли доступны частные методы trait в классе?

Можно

20. Можно ли компоновать traits в trait?

Можно

21. Расскажите об обработке ошибок и исключения (try catch, finaly и throw).

Исключение в PHP может быть выброшено (throw) и поймано (catch). Код может быть заключён в блок try, чтобы облегчить обработку потенциальных исключений. У каждого блока try должен быть как минимум один соответствующий блок catch или finally. Исключения необходимо для информативного оповещения об ошибке приложения.

22. Что такое type hinting, как работает, зачем нужен?

Type Hinting — это механизм, который позволяет явно указывать типы параметров функций и типы возвращаемых значений.

23. Что такое namespace-ы и зачем они нужны?

В PHP пространства имён используются для решения двух проблем, с которыми сталкиваются авторы библиотек и приложений при создании повторно используемых элементов кода, таких как классы и функции:

  1. Конфликт имён между вашим кодом и внутренними классами/функциями/константами PHP или сторонними.

  2. Возможность создавать псевдонимы (или сокращения) для Ну_Очень_Длинных_Имён, чтобы облегчить первую проблему и улучшить читаемость исходного кода.

24. Сравнение значений переменных в РНР и подводные камни? Приведение типов. Что изменилось в PHP 8 в этом контексте?

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

В восьмой версии PHP появились несколько новый типов данных, а именно:

  • Union типы

  • Static как возвращаемый тип данных

  • mixed

25. Как работает session в РНР, где хранится, как инициализируется?

Сессии являются простым способом хранения информации для отдельных пользователей с уникальным идентификатором сессии. Это может использоваться для сохранения состояния между запросами страниц. Идентификаторы сессий обычно отправляются браузеру через сессионный cookie и используются для получения имеющихся данных сессии. Отсутствие идентификатора сессии или сессионного cookie сообщает PHP о том, что необходимо создать новую сессию и сгенерировать новый идентификатор сессии.

Создается файл в директории на сервере, который указан в конфигурации php

26. Суперглобальные массивы. Какие знаете? Как использовали?

Обращение напрямую к суперглобальным переменным в реальных проектах не рекомендуется, однако иногда применяется для доступа к полученным в запросе данным.

27. Сравните include_once vs required_once.

Ответ в пункте 9 с той лишь разницей, что при добавлении _once файл подключается единожды

28. Что означает сложность алгоритма?

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

29. Что такое замыкание в PHP? Приведите пример.

Замыкания в PHP представляют анонимную функцию, которая может использовать переменные из своего локального окружения. В отличие от обычных анонимных функций замыкания в PHP могут применять выражение use.

30. В чем разница между замыканием в PHP и JavaScript?

Замыкание в PHP и JavaScript представляет собой концепцию, при которой функция сохраняет доступ к переменным из внешней области видимости, даже после завершения выполнения внешней функции. Однако есть некоторые различия в их синтаксисе и использовании. В PHP для передачи переменных в замыкание часто используется ключевое слово use, а в JavaScript замыкание создается автоматически при определении функции внутри другой функции, без необходимости явно указывать передаваемые переменные. В обоих случаях замыкания предоставляют гибкость для работы с переменными из внешних областей видимости, что может быть полезно, например, при создании обработчиков событий или колбэков.

31. Что такое позднее статическое связывание? Расскажите о поведении и применения static.

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

32. Как переопределить хранение сессий?

В опции session.save_handler.

Так же можно использовать функцию session_set_save_handler(). Эта функция позволяет установить пользовательские обработчики для сессионных событий, таких как открытие, чтение, запись, удаление и закрытие сессии.

Прежде чем использовать session_set_save_handler(), необходимо создать класс, реализующий интерфейс SessionHandlerInterface. Этот интерфейс определяет методы, которые будут вызываться при различных событиях сессии.

33. Расскажите о SPL-библиотеке (Reflection, autoload, структуры данных).

Стандартная библиотека PHP (SPL - Standard PHP Library) представляет собой набор классов и интерфейсов, предоставляющих различные инструменты для обработки структур данных, манипуляции итераторами, реализации автозагрузки классов, работы с отражениями (reflection) и других задач.

34. Расскажите о принципах SOLID.

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

Принцип открытости/закрытости - Программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что эти сущности могут менять свое поведение без изменения их исходного кода.

Принцип подстановки Барбары Лисков - Функционал, который наследуется от базового типа должен иметь возможность использовать функционал базового типа. Выносим только общий функционал из классов в базовый класс.

Принцип разделения интерфейса - Клиенты не должны зависеть от методов, которые они не используют. То есть если какой‑то метод интерфейса не используется клиентом, то изменения этого метода не должны приводить к необходимости внесения изменений в клиентский код.

Принцип инверсии зависимостей - Модули верхнего уровня не должны зависеть от модулей нижнего уровня.

35. Расскажите о шаблонах GRASP.

GRASP (General Responsibility Assignment Software Patterns) - это набор принципов и шаблонов проектирования, которые предоставляют рекомендации по тому, как назначать ответственности (assignments of responsibility) в объектно-ориентированных системах. GRASP не является строгим набором правил, а скорее предоставляет некоторые общие рекомендации для улучшения проектирования системы. Вот несколько ключевых шаблонов GRASP:

  1. Information Expert (Информационный эксперт)

  2. Creator (Создатель)

  3. Controller (Контроллер)

  4. Low Coupling (Низкая связанность)

  5. High Cohesion (Высокая связанность)

  6. Polymorphism (Полиморфизм)

  7. Pure Fabrication (Чистая выдумка)

  8. Indirection (Индирекция)

36. Расскажите о Dependency Injection: что такое DI-контейнеры? Какие есть варианты реализаций?

Dependency Injection (внедрение зависимостей) - это паттерн проектирования, который предоставляет способ управления зависимостями объекта. Вместо того чтобы объект сам создавал или получал зависимости, они предоставляются извне, что делает код более гибким, тестируемым и легким для поддержки. Зависимости могут быть внедрены через конструктор, метод или свойства объекта.

37. Что вам известно о MVC?

MVC (Model-View-Controller) - это шаблон проектирования, который разделяет приложение на три основных компонента: Model (Модель), View (Представление) и Controller (Контроллер). Этот подход обеспечивает более четкую организацию кода, улучшает его модульность и обеспечивает разделение ответственностей между различными компонентами.

38. Что вам известно о шаблонах GoF?

Шаблоны GoF (Gang of Four) - это набор 23 классических шаблонов проектирования, описанных в книге "Design Patterns: Elements of Reusable Object-Oriented Software" (по-русски: "Паттерны проектирования: элементы повторного использования объектно-ориентированного программирования"), написанной Эрихом Гаммой, Ричардом Хелмом, Ральфом Джонсоном и Джоном Влиссидесом. Книга была издана в 1994 году и стала классикой в области программирования. Шаблоны GoF помогают разработчикам создавать гибкие, поддерживаемые и расширяемые объектно-ориентированные системы.

39. Что вам известно о шаблонах, которые применяются в ORM?

ORM (Object-Relational Mapping) представляет собой технику, которая связывает объекты в коде программы с записями в базе данных. Часто для реализации ORM используются различные шаблоны проектирования. Вот несколько из них:

  1. ActiveRecord (Laravel - Eloquent ORM)

    • Каждый объект - это таблица в базе данных

    • Каждый атрибут объекта это колонка в БД

    • Объекты могут содержать логику и методы работы с данными

    • Несомненный плюс - это простота и низкий порог вхождения

  2. DataMapper (Symfony - Doctrine ORM)

    • Объекты приложения и их свойства не связаны со структурой БД. Это просто отдельные юниты домена бизнес-логики

    • Связь с базой данных осуществляется за счет отдельного слоя - маппера

    • Это дает гибкость и абстрактность - при смене базы данных или структуры хранения мы не зависим от объектов-моделей, а только от реализации маппера

    • Разделение логики работы с данными и бизнес-логики

40. Что такое Docker? Каков принцип его работы?

Docker - это платформа для разработки, доставки и выполнения приложений в контейнерах. Контейнеры представляют собой легковесные и автономные исполняемые пакеты, включающие в себя все необходимые для запуска приложения компоненты, такие как код, среда выполнения, системные инструменты, библиотеки и настройки.

41. Что такое LAMP / NAMP?

LAMP и NAMP - это два стека технологий, широко используемых для разработки и развертывания веб-приложений. Оба эти стека представляют собой комбинацию различных программных компонентов, обеспечивающих инфраструктуру для работы веб-приложений. Рассмотрим их подробнее:

  1. LAMP:

    • Linux: Операционная система Linux, широко используемая в качестве основной платформы для серверов.

    • Apache: Веб-сервер Apache. Это один из самых популярных веб-серверов в мире, обеспечивающий обработку HTTP-запросов, управление виртуальными хостами и другие веб-серверные функции.

    • MySQL: Система управления базами данных MySQL. MySQL - это реляционная база данных, используемая для хранения и управления данными веб-приложений.

    • PHP: Язык программирования PHP. PHP - это скриптовый язык программирования, часто используемый для разработки серверной части веб-приложений.

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

  2. NAMP:

    • Nginx (или Apache): В стеке NAMP, вместо Apache, может быть использован Nginx - еще один популярный веб-сервер. Nginx также обеспечивает обработку HTTP-запросов, но часто считается более легковесным и производительным по сравнению с Apache.

    • Apache (или Nginx): Оба эти веб-сервера являются основными компонентами стека, обеспечивая обработку HTTP-запросов и другие веб-серверные функции.

    • MySQL: Аналогично LAMP, стек NAMP использует MySQL в качестве системы управления базами данных.

    • PHP (или другие языки программирования): Стек NAMP может включать в себя PHP, аналогично LAMP, или другие языки программирования, такие как Python (для NAPY) или Node.js (для NANP).

42. Расскажите о regexp.

regexp, сокращение от "regular expression" (регулярное выражение), представляет собой последовательность символов, которая определяет шаблон поиска текста. Регулярные выражения используются для выполнения операций поиска, сопоставления и манипуляций с текстом в строках. Они предоставляют мощные средства для работы с текстовыми данными.

43. Расскажите о SSH-протоколе.

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

44. Что такое PDO?

PDO (PHP Data Objects) представляет собой расширение для языка программирования PHP, предоставляющее унифицированный интерфейс для взаимодействия с различными базами данных. Оно предоставляет абстракцию для работы с базами данных, что позволяет разработчикам писать переносимый и более безопасный код при работе с базами данных.

45. Что нового появилось в PHP 8?

Некоторые нововведения в восьмой версии языка:

  • JIT-компиляция

  • Статический анализ типов

  • Union типы

  • Строгая типизация для аргументов и возвращаемых значений функций

  • Match выражение

  • Nullsafe оператор ?->

46. Что такое PHP PEAR?

PEAR (PHP Extension and Application Repository) - это распределенный репозиторий, содержащий библиотеки, фреймворки, расширения и инструменты, написанные на языке программирования PHP. PEAR обеспечивает стандартизированный способ установки и распространения переиспользуемого PHP-кода.

47. В чем разница между GET и POST?

Разница между методами GET и POST в HTTP-протоколе заключается в способе передачи данных. Метод GET отправляет параметры запроса в URL, что делает их видимыми в строке браузера, и подходит для передачи небольших объемов данных, таких как параметры поисковых запросов. С другой стороны, метод POST передает параметры в теле HTTP-запроса, делая их невидимыми в URL. POST обычно используется для передачи более крупных объемов данных, таких как данные форм, и обеспечивает более безопасную передачу конфиденциальной информации, так как параметры не отображаются в URL-адресе браузера.

48. Чем отличаются операторы BREAK и CONTINUE?

В PHP операторы break и continue используются в циклах (например, for, while, do-while, foreach) для управления ходом выполнения цикла.

Когда оператор break выполняется внутри цикла, выполнение цикла завершается, и управление передается за пределы цикла или к следующей инструкции после цикла.

Когда оператор continue выполняется внутри цикла, текущая итерация цикла завершается, и управление передается к следующей итерации.

49. Есть ли разница между одинарными и двойными кавычками?

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

50. Что такое Cookie и зачем они используются?

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

51. Что нельзя хранить в Cookie и почему?

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

Tags:
Hubs:
Total votes 23: ↑17 and ↓6+11
Comments27

Articles