Л А Б О Р А Т О Р И Я

актуальных

РЕШЕНИЙ


Статья в разработке

PHP - типичные вопросы на собеседовании

разбираем вопросы, которые часто задают программистам-соискателям

Изложенный материал рассчитан на начинающих разработчиков, которые уже обладают некоторыми начальными теоретическими знаниями ООП (объектно-ориентированного программирования) и языка программирования PHP.

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

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

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

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

Приступим!

  Отличие СОБЕСЕДОВАНИЯ от ИНТЕРВЬЮ  

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

Большинство не видят или не понимают разницы, но есть существенное отличие. Если в ИНТЕРВЬЮ вам будут задавать вопросах и вы будете на них отвечать, сами при этом не должны задавать вопросы (или они будут проигнорированы), то при СОБЕСЕДОВАНИИ процесс обоюдный, каждая сторона может задавать вопросы относящиеся к теме обсуждения.

В СОБЕСЕДОВАНИИ лучше участвовать на старте, при знакомстве, с компанией или заказчиком.

ИНТЕРВЬЮ может понадобится для определения ваших персональных компетенций. Причем, если ИНТЕРВЬЮ проводится человеком не в теме, который только зачитывает вопросы и ожидает "ключевые" слова в ответах, то это может стать некоторой сложностью в общении. Стоит уточнять уровень компетенций интервьюера предварительно.

  ООП - основные понятия  

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

Основополагающие принципы ООП:

  • Инкапсуляция - сокрытие реализации, или, ограничение доступа к определённым компонентам объекта;
  • Наследование - создание новой сущности на базе уже существующей;
  • Полиморфизм - возможность иметь разные формы для одной и той же сущности, или, классы с одинаковой спецификацией могут иметь различную реализацию (например, реализация класса может быть изменена в процессе наследования);
  • Абстракция - набор общих характеристик, которые концептуально описывают сущность в пределах системы использования (например, классы описывают объекты некоторым конечным набором общих параметров: свойств, методов).

Стоит обратить внимание, что в РНР не поддерживается множественное наследование, т.е. каждый класс может иметь только одного родителя (предка).

В центре ООП находится понятие объекта. Объект порождается в виде эксземпляра некоторого класса, который содержит в себе описание свойств (признаков) и методов (действий).

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

Программа считается объектно-ориентированной, только если выполнены следующие требования:

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

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

.

.

  Области видимости - модификаторы доступа 

Область видимости свойства, метода или константы может быть определена путём использования следующих ключевых слов в объявлении:

  • public (общедоступный) - доступ к свойствам и методам класса разрешён отовсюду;
  • protected (защищённый) - разрешает доступ самому классу, наследующим его классам и родительским классам;
  • private (закрытый) - ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ.

Свойства, методы или константы объявленные без указания области видимости, определяются как public.

  Абстрактные классы и методы в PHP  

Абстрактные классы - своего рода шаблоны классов, не могут иметь экземпляров - объектов, используются для наследования.

Такой класс может содержать абстрактные методы. По сути, это лишь объявление методов, которые должны быть реализованы в дочерних классах.

Если в классе объявлен абстрактный метод, то и сам класс должен быть объявлен как абстрактный.

  Интерфейсы в PHP  

Интерфейсы - условия (иногда называют "контракт") которые должен исполнять класс, если он связан с интерфейсом.

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

.

  "Магические методы" PHP  

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

Всего этих методов около двух десятков, но чаще всего достаточно назвать: __constructor, __get, __set, как наиболее часто используемые, и пояснить что они делают.

Названия всех магических методов начинаются с двойного подчеркивания.

  • __constructor - позволяет объявлять методы-конструкторы. Классы, в которых объявлен метод-конструктор, будут вызывать этот метод при каждом создании нового объекта, так что это может оказаться полезным, например, для инициализации какого-либо состояния объекта перед его использованием.
  • __get - (геттер) будет выполнен при чтении данных из недоступных (защищённых или приватных) или несуществующих свойств.
  • __set - (сеттер) будет выполнен при записи данных в недоступные (защищённые или приватные) или несуществующие свойства

  "Хлебные крошки"  

Работа с каталогами древовидной иерархии.

Собственно относится уже не к программированию на РНР, а к организации структуры хранения данных в реляционных СУБД при работе с каталогами древовидной структуры.

Структура данных — это то, как данные связаны между собой. Дерево — одна из возможных структур данных. Ещё есть связанные списки, стеки, очереди, множества, хеш-таблицы, карты и даже кучи (heap).

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

Наиболее известные методы работы с древовидными иерархическими структурами в реляционных БД:

Обычно бывает достаточно пояснить принцип работы хотя бы одного метода. Например, самый простой для понимания - «Path Enumeration» (его ещё называют «Materialized Path»). Хранение данных в таблице реляционной СУБД, в этом методе может быть дополнено отдельной колонкой, хранящей код родительской структуры для каждого элемента в виде А/В/С... (где А - код корневого элемента, В, С и т.д. - последующие подчиненные уровни). В виде значений А,В,С могут использоваться id сответствующих элементов. В этом случае поиск конкретных элементов и/или подчиненных структур сводится к SQL запросу SELECT c LIKE и указанием А/В/С%.

  Паттерны  

Паттерны - шаблоны, подходы к решению типовых задач.

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

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

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

Фабрика (Factory) - cуществует три вида шаблона фабрика:

  • Простая Фабрика - этот шаблон предоставляет интерфейсы для создания объектов, скрывая саму логику создания от клиента.
  • Фабричный Метод - предоставляет интерфейсы для создания объектов, но позволяет дочерним классам самим определять, какой класс следует инициализировать.
  • Абстрактная Фабрика - в отличие от указанных выше двух шаблонов, абстрактная фабрика - это интерфейс для создания связанных объектов без указания их классов. Так же можно сказать, что она предоставляет объект другой фабрики, которая отвечает за создание необходимых объектов.

Фасад - предоставление простого интерфейса для взаимодействия со сложной системой (библиотекой, фреймворком и т.п.).

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

Инъекция зависимостей (внедрение зависимости, Dependency Injection) - внесение в зависимый класс объекта(экземпляра) другого класса, вместо создания объекта внутри зависимого класса. Объект класса который внедряется, создается вне зависимого класса. Инъекция может осуществляться различными способами: через конструктор, "set" метод, свойство.

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

MVC, MVP, MVVM - не все воспринимают эти аббревиатуры как паттерны, считая их архитектурой. Но это уже устоявшиеся определения, которые являются шаблонами в разработке. Основные отличия можно посмотреть на картинке:

  Вычисление факториала числа - рекурсия  

Вычисление факториала числа - это классическая задача, которая решается с помощью рекурсии.

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

Основная цель, которую преследуют при написании функции для рекурсии - это выделить участок кода, который будет циклично использоваться.

Вот пример вычисления факториала:


function factorial($n) {

  if($n == 1 || $n == 0) return 1;

  return $n * factorial($n - 1); // рекурсивный вызов функции

}

echo factorial(5);


Результатом выполнение этого кода будет вывод на экран числа 120.

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