php собеседование в вопросах и ответах

Собеседования на должность PHP разработчика

php собеседование в вопросах и ответах. Смотреть фото php собеседование в вопросах и ответах. Смотреть картинку php собеседование в вопросах и ответах. Картинка про php собеседование в вопросах и ответах. Фото php собеседование в вопросах и ответах
Довольно часто (постоянно) мне приходиться проводить собеседование людей желающих устроитсья в мой отдел на должность «junior PHP developer» и «PHP developer». И, с завидным постоянством, я и team-lead отдела задаем одни и те же вопросы…

Каждое собеседование начинается с одного и того же вопроса:

— Почему PHP?

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

А теперь начинается самое оно:

— Какую версию PHP использовали? В чем различия между четвертой и пятой версиями?

— Какими сторонними библиотеками пользовались?

— Опыт работы с различными CMF/CMS?

— Типы данных в PHP?(их всего 8, не верите — читайте мануал)

— Назови по памяти функции для работы с массивами, строками

— Что такое сериализация?

И далее несколько практических вопросов…

— Что такое Apache? А mod_rewrite?

— Аббревиатура SVN и CVS о чем-нить говорят?

— Багтрекинг системы? BugZilla? JIRA?

Не забываем и о БД:

— Что такое реляционная база данных?

— Нормализация, денормализация

— И чуть-чуть практики (связь многое-ко-многим в MySQL, каталог товаров произвольной вложенности)

HTML + CSS + W3C (знания HTML на базовом уровне считаю обязательным):

— Нарисуй-ка простенькую форму для отправки файла

— Что такое стандарты W3C?

— С *nix знаком?

— Apache и PHP сетапил?

Сетевые технологии и не только:

— Знаешь что такое уровни модели OSI? Назови хотя бы их количество. (это вопрос на «пять»)

— По какому протоколу осуществляется передача данных в сети Интернет?

— Расскажи что поисходит, когда в строке браузера набираешь адрес и нажимаешь Enter?

Тут особо не мучаем, если же в резюме указан уровень знания английского как «хорошо» — вот тогда нам на помощь спешит COTOHA — лучше правдиво пишите — уровень университета или начальной школы… 😉

Бывает, озадачиваем каким-нить тестом на сообразительность (поменяй-ка друг значение переменных A и B местами не используя третью переменную)

Вот подумываем написать тест, который однозначно говорил бы о уровне знаний человека (brainbench для новичков не подходит), если у кого есть что предложить — пишите в комментариях…

Кросспост: PHP: Собеседование (и там уже много содержательных комментариев)

Upd: Вторым, или даже первым вопросом наверное скоро будет: «Читаете ли вы Хабр по пятницам?»…

Источник

PHP. 25 вопросов, задаваемых на собеседовании

php собеседование в вопросах и ответах. Смотреть фото php собеседование в вопросах и ответах. Смотреть картинку php собеседование в вопросах и ответах. Картинка про php собеседование в вопросах и ответах. Фото php собеседование в вопросах и ответах

Отличие include от require также заключается в том, что require выдает Fatal error при невозможности подключения файла по любой причине. include выдаст Warning и продолжит работу.

Вопрос на собеседовании по PHP №2: «Как мы можем получить IP-адрес клиента?»

unset() устанавливает переменную в “ undefined ”, в то время как unlink() удаляет файл, который отправляется из файловой системы.

Вопрос по PHP №4: что выведет на экран следующий код:

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

Вопрос с собеседовани по PHP №5: Каковы основные типы ошибок в PHP и чем они отличаются?

В PHP существует три основных типа ошибок:

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

Понимание основ протокола HTTP очень важно для хорошего старта в качестве разработчика PHP и различия между GET и POST являются неотъемлемой его частью.

Вопрос №7: Как вы включить сообщения об ошибках в PHP?

Установите display_errors = on в php.ini или объявите ini_set(‘display_errors’, 1) в вашем сценарии. Затем, добавьте error_reporting(E_ALL) в ваш код, чтобы отобразить все типы сообщений об ошибках во время выполнения скрипта.

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

Вопрос №8: Что такое Трейты (Traits)?

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

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

PHP-вопрос, который могут задать №9: Может ли значение константы измениться во время выполнения скрипта?

Нет, значение константы не может быть изменено, если она уже была объявлена в ходе выполнения PHP-кода.

Нет, это невозможно. Класс Final или объявление метода не позволяет дочернему классу или методу переопределять настройки.

Вопрос №11: Что делают методы __construct() и __destruct() в PHP-классе?

Все объекты в PHP имеют встроенные методы конструктор и деструктор. Метод Конструктор вызывается сразу после того, как создается новый экземпляр класса и он используется для инициализации свойств класса. Метод Деструктор не принимает никаких параметров.

Понимание этих двух PHP-методов означает, что кандидат знает основы объектно-ориентированного программирования в PHP.

Вопрос №12: Как мы можем получить количество элементов в массиве?

Функция count() используется для возвращения количества элементов в массиве.

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

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

PHP Вопрос №15: Предположим, что у вас есть форма подпики на рассылку.

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

Вопрос №15: Работа с классами

Этот вопрос будет оценивать знание кандидатом объектно-ориентированного программирования.

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

PHP Вопрос №17: Что такое геттеры и сеттеры и для чего они нужны?

Знание о геттерах и сеттерах важно для любого программиста, который ищет работу разработка web-приложений. Геттеры и сеттеры часто используются при работе с объектами, особенно те, которые окажутся в базе данных или другом месте хранения. Поскольку PHP обычно используется для создания веб-приложений, даже младший специалист будет встречаться с геттерами и сеттерами в более продвинутых средах. Геттеры и сеттеры очень мощные, но них редко упоминают. Вы сможете произвести приятное впечатление на интервьюера, зная, что они собой представляют и как их использовать.

Вопрос с собеседования №18: Что означает MVC и что делает каждый компонент?

MVC расшифровывается как Model (Модель) View (Представление) Controller (Констроллер).

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

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

Представление – это данные, переданные контроллером и отображаемые пользователю.

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

Ничего не выводите в браузер до использования кода, который преобразует HTTP-заголовки. После того, как вы вызовите echo или любой другой код, который очищает буфер, вы больше не сможете присваивать «куки» или заголовки. Это также подходит к сообщениям об ошибках, поэтому если ошибка появляется до того, как вы используете команду заголовка и INI-директива display_errors установлена, это также выведет сообщение об ошибке.

Вопрос №20: Что такое SQL-инъекции и каковы наиболее эффективные методы их предотвращения?

SQL-инъекции являются методом are a method to изменения a запроса в SQL-операторе, отправленном на сервер базы данных. Этот измененный запрос затем может пропускать такую информацию, как логин\пароль, и может поспособствовать хакерам подвергнуть сервер угрозе.

Не используйте устаревшие (начиная с PHP 5.5) mysql_* функции, а использовуйте PDO, т.к. оно позволяет использовать серверы, отличные от MySQL. Допускается также использование mysqli_* но в наши дни нет особого смысла не использовать PDO, ODBC или DBA. В идеале можно использовать Doctrine или Propel, чтобы избежать написания SQL-запросов всех вместе, а использовать маппинг, относящийся к объектам, который связывает строки из базы данных с объектами вашего приложения.

Вопрос №21: Что делает следующий код?

Если вы хотите проверить какой-то определенный тип, например, целое число или логическое значение, то === будет делать именно то, что ожидается от конкретно набранной команды, в то время как == будет конвертировать данные лишь на время и попытается сопоставить оба типа операндов. Тождественный оператор ( === ) работает быстрее, поскольку не приходится иметь дело с преобразованием типов. Особенно при проверке переменных на истина\ложь лучше избегать == т.к. 0/1 или другая похожая форма также будет принята в расчет.

Вопрос №23: Что такое PSR?

PSR является набором рекомендаций по стандартам PHP, которые направлены на стандартизацию общих аспектов PHP-разработок. Примером PSR является PSR-2, который является своеобразным гидом по стилям кодирования.

Вопрос №24: Какому PSR стандарты вы следуете? Почему нужно следовать стандарту PSR?

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

Вопрос №25: Используете ли вы Composer? Если да, то какие преимущества вы нашли в нем?

Использование Composer’а – это инструмент для управления зависимостями. Вы можете объявлять библиотеки, с которыми работаете, а Composer займется их установкой и обновлением. Еще одним преимуществом является последовательный метод управления библиотеками, с которыми вы работаете, так что вы потратите меньше времени на это самое управление, занимаясь своим проектом.

Источник

Собеседование на PHP разработчика. Более 100 вопросов для Junior, Middle и Senior

Собрал список вопросов, по которым можно подготовиться к собеседованию или которые можно спросить у дипломированного PHP-разработчика. Конечно, список, не является исчерпывающим. Больше вопросов с кодом в нашем телеграм-канале @phpquiz. Погнали по вопросам!

Junior

Основы

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

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

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

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

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

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

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

Чем отличаются ключевые слова: include и require, mysql_connect и mysql_pconnect?

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

Может ли абстрактный класс содержать частный метод?

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

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

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

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

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

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

будут доступны частные методы trait в классе?

можно компоновать traits в trait?

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

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

Что такое namespace и зачем они?

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

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

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

Сравните include vs required, include_once vs required_once.

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

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

Какая разница между замыканием в PHP и JavaScript?

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

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

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

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

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

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

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

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

Напишите / расскажите на PHP пример реализации паттерна Singleton.

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

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

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

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

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

Какие версии PHP до сих пор поддерживаются?

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

Какие еще HTTP-методы знаете?

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

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

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

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

Какую среду разработки предпочитаете и почему?

Какой командой добавить изменения?

Какой командой зафиксировать изменения?

Какой командой отправить изменения в удаленный репозиторий?

Базы данных

Что такое транзакция?

Что такое нормализация?

Что такое денормализации? Для чего она нужна?

Какие типы связей в базе данных?

Что означает утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей?

Если используемая вами СУБД не поддерживает каскадные удаления для поддержки ссылочной целостности связей, что можно сделать для достижения аналогичного результата?

Что такое первичный и внешний ключи?

Какие различия между первичным и уникальным ключами?

Какие типы JOIN и в чем различия?

Что такое курсоры в базах данных?

Что такое агрегатные функции SQL? Приведите несколько примеров.

Что такое миграции?

Расскажите о связи друг к другу, один ко многим, многие ко многим.

Зачем используют оператор группировки GROUP BY?

В чем разница между WHERE и HAVING? Приведите примеры.

В чем разница между операторами DISTINCT и GROUP BY?

Для чего нужны операторы UNION, INTERSECT, EXCEPT?

Опишите разницу типов данных DATETIME и TIMESTAMP.

Какие вы знаете двигатели таблиц и чем они отличаются?

Какие способы оптимизации производительности баз данных знаете?

Что такое партицирование, репликация и шардинг?

Чем отличаются SQL от NoSQL базы данных?

Какие бывают NoSQL базы данных?

Какие типы данных есть в MySQL?

Разница между LEFT JOIN, RIGHT JOIN, INNER JOIN?

Разница между JOIN и UNION?

Что такое индексы? Как они влияют на время выполнения SELECT, INSERT?

Что такое хранимые процедуры, функции и триггеры в MySQL? Для чего они? Приведите примеры использования.

Как организовать сохранность вложенных категорий в MySQL?

Практические задания

Спроектируйте базу данных для хранения информации о книгах и их авторов. Напишите запрос для выборки всех авторов и количества написанных ими книг.

Есть матрица 3 × 3. Посчитайте диагонали, только парные / нечетные числа в диагоналях.

Ваш приложение выдает 500 ошибку. Опишите последовательность поиска проблемы.

Напишите функцию, которая определяет, слово является палиндромом.

Какой результат выдаст такой код и почему: If (-1) print «True» else print «False»

Какой результат выдаст такой код и почему: var_dump (array_merge ([2 => ‘a’], [3 => ‘b’]));

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

Есть массив Integer, напишите возможные способы, как увеличить каждый элемент на единицу (1).

Order

User

Напишите запрос для увеличения значения column1 на 1 для id = 2

Напишите цикл for так, чтобы аргумент цикла менялся в геометрической прогрессии.

Что выведут выражения:
print (!! «false»)
print (!! true)
print ((int) ‘125g7’)
print ((int) ‘x52’)

Результат выполнения функции? Как исправить результат?
in_array (1, [0, ‘0’, true])

Напишите класс с реализацией всех возможных способов строгой типизации данных с учетом возможностей PHP 8.

Middle

Основы

Как передаются переменные (по значению или по ссылке)?

Какие процессы происходят, когда пользователь вводит в браузере URL?

Что такое вариативная функция или spread-оператор?

Какие типы уязвимостей знаете? Как от них защищаться?

Что такое идемпотентность метода? Какие HTTP-методы являются идемпотентными для REST?

Что такое stateless?

SOAP vs REST. В чем разница?

Какие методы авторизации используют для построения API?

Что может содержать интерфейс?

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

Что такое Mock? Где используют и зачем?

Опишите реализацию одного из шаблонов проектирования.

Как хранятся данные в redis / memcached?

Расскажите о целесообразности применения redis / memcached для кэширования. Какие плюсы и минусы?

Назовите различия между nginx и apache.

Что такое opcash? Как он работает?

Что такое JIT? Как он работает?

Зачем нужно ключевое слово final?

Что нового в РНР 7/8?

Что такое SOLID, DRY, KISS, YAGNI?

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

Что такое простая фабрика?

Что такое Service Layer и где его следует применять?

Как устроен Singleton и почему его считают антипатерном?

Что такое идемпотентность?

Опишите жизненный цикл HTTP-запроса?

Что такое куча и стек?

Что такое рефлексия?

Что такое хэш-функция и где она используется?

Как применяются очереди в РНР?

Как в общих чертах работает opcache?

Чем отличаются модульные тесты от интеграционных?

Что такое трейты? Как применять на практике?

Как разрешить конфликты при использовании trait?

Как работает автозагрузки классов?

В чем разница между стеком и очередью?

Расскажите о Unit Tests (required), Functional Tests (optional). Моки и стаб в PHP.

Представим ситуацию, в которой нам нужно вызвать частный метод, как это сделать?

Опишите разницу между PHP-FPM и PHP на сокете.

Как бы вы реализовали загрузки больших отчетов с большим количеством данных (файлы от 1 гигабайта до N гигабайт).

​​Как бы вы импортировали 50-гигабайтный файл xml в базу данных?

Почему после PHP 5 идет сразу 7, куда делась 6?

Есть ли разница между self и this в PHP?

У нас есть важный PHP-файл, его надо запускать каждые 20 секунд, как бы вы это сделали?

Как расшифровать 644 в правах на файл в Linux?

В чем разница между merge и rebase?

Какой командой можно сделать ресет изменений, не потеряв их?

Что такое stash и зачем он нужен?

Базы данных

Какая разница между MyISAM i InnoDB? В каких случаях и лучше применять?

Как найти и оптимизировать «тяжелые» запросы?

Какие типы индексов?

Как хранить координаты точки на карте в БД?

Какие типы индексов бывают в RDBMS?

Какое свойство полей БД нужно учитывать при выборе типа индекса?

Когда следует использовать индексы, преимущества и недостатки?

Что такое план выполнения запроса и как его узнать?

В чем разница между типами данных CHAR и VARCHAR в SQL?

Каково назначение транзакций? Расскажите о принципе работы.

Назовите 3-4 нормальные формы реляционных БД.

Каково назначение репликации? Какие типы связей и в чем разница между ними?

Что такое индексация? Какие типы индексов? Какой смысл их использовать?

Что такое полнотекстовый поиск в MySQL? Как он реализуется?

Что такое cursor в MySQL-процедурах?

Расскажите о RabbitMQ или Gearman.

Что знаете о Solr / ElasticSearch?

Что такое deadlock MySQL?

Влияет ли порядок JOIN на план выполнения MySQL-запроса?

Практические задания

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

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

Какой результат выдаст такой код:

Какие модификаторы доступа допустимые в реализации метода getName

Реализуйте очередь сообщений, используя MySQL для хранения данных. Как избежать ситуации, когда несколько воркеров получат в обработку одинаковое сообщение?

Есть мануал на API с курсом валют. Нужно найти минимумы-максимумы за 5 лет, а потом то же, но с разбивкой по месяцам.

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

Источник

Руководство по собеседованию на вакансию PHP-программиста

Вездесущий… это определённо то слово, которым можно описать язык PHP по отношению к вебу. Он действительно вездесущ. В настоящее время, среди всех серверных языков программирования, PHP используется наиболее широко. На нём написаны более 80% сайтов, при этом следующий по популярности ASP.NET со своими 17% остаётся далеко позади.

php собеседование в вопросах и ответах. Смотреть фото php собеседование в вопросах и ответах. Смотреть картинку php собеседование в вопросах и ответах. Картинка про php собеседование в вопросах и ответах. Фото php собеседование в вопросах и ответах

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

Именно в этом и заключается основная проблема поиска высококвалифицированных PHP-разработчиков. Относительно низкий порог вхождения и 20 лет развития языка привели к тому, что PHP-программисты стали такими же вездесущими, как и сам PHP. Многие из них могут на законных основания утверждать, что «знают» язык. Однако разработчики, которые действительно являются экспертами по PHP, способны создавать куда более функциональное, надёжное, масштабируемое и простое в сопровождении программное обеспечение.

Как же отличить тех, кто обладает реальной компетентностью в PHP (не говоря уже о тех, кто входит в 1% наиболее опытных кандидатов) от тех, у кого только поверхностные знания?

От переводчика: данный текст представляет собой перевод и адаптацию с небольшими дополнениями статьи The Insider’s Guide to PHP Interviewing, ссылка на которую была опубликована в последнем июньском дайджесте по PHP. Я постарался максимально передать смысл оригинала, добавил несколько пояснений, значительно увеличил количество ссылок на документацию, а также добавил ссылки на статьи с хабра и на другие источники. Важное отличие от оригинала: добавлена навигация по вопросам, часть кода и текста скрыта под спойлеры.

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

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

Список вопросов

Ключевые концепции и парадигмы

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

Вопрос: Расскажите о замыканиях в PHP. Приведите примеры, когда, почему и как они могут быть использованы?

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

Первый строительный блок для замыкания – это анонимные (лямбда) функции, т.е. такие функции, у которых нет ассоциированных с ними имён. Например:

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

Внутреннее устройство замыканий в PHP представлено специальным классом замыканий – Closure.
Содержимое анонимной функции существует в своей области видимости независимо от области видимости, в которой эта функция была создана. Тем не менее, можно явно связать одну или несколько переменных из внешней области видимости, на которые можно будет сослаться в области видимости анонимной функции. Для этого нужно воспользоваться конструкцией use при определении анонимной функции.

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

Но, как часто бывает в программировании, никогда не говори никогда. Существует ряд надёжных и стабильных продуктов, написанных на PHP, которые активно пользуются глобальными переменными: WordPress, на котором работает около 20% всех сайтов (и это число растёт из года в год), Joomla! 1.5 (да, она до сих пор еще широко распространена) и iLance Enterprise Auction system – это все примеры успешных проектов, в течение многих лет использующих глобальные переменные. Точно так же и у вас могут возникнуть ситуации, в которых глобальные переменные будут уместны, однако к их применению нужно подходить осторожно.
К списку вопросов

Вопрос: Расскажите о пространствах имён в PHP и о том, почему они полезны.

Одно из объектно-ориентированных нововведений в PHP 5.3 – пространства имён. Как следует из названия, пространство имён определяет такую область видимости в программе, внутри которой имена классов, интерфейсов, функций, переменных и констант не будут вызывать конфликтов с элементами, обладающими такими же именами в другом пространстве имён.

Явное задание пространства имён, в области видимости которого будут определены все элементы (классы, переменные и т.д.), позволяет разработчику решить эту проблему. При использовании пространства имён, приведенное выше многословное название класса можно заменить на следующее:

Кроме того, элементы из одного пространства имён могут быть импортированы в другое и использоваться в нём непосредственно (т.е. без ссылок на исходное пространство имён). Этого можно добиться с помощью ключевого слова use :

Вопрос: Что такое типажи (traits, трейты)? Опишите их основные характеристики и расскажите, чем они полезны. Приведите пример объявления типажа и класса, использующего несколько типажей.

Типажи – это великолепное дополнение, появившееся в PHP 5.4, позволяющее добавлять классу поведение без необходимости расширения родительского класса через наследование (до версии 5.4 это можно было реализовать с помощью паттерна примесь). Важно отметить, что в контексте одного класса можно использовать несколько типажей. Их применение способствует улучшению организации кода и разделению обязанностей, а также соответствует известному принципу проектирования, гласящему: «предпочитайте композицию наследованию».

PHP на пальцах

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

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

Теперь можно просто обратиться к свойству ‘whiskers’:

Используя метод __get для перехвата ссылок на свойства, внешне похожие на публичные, мы способны скрыть детали реализации этих свойств.
Метод __set применяется аналогично:

Изменение значения свойства ‘whiskers’ будет выглядеть так:

Это выражение приведет к автоматическому вызову метода __set() с передачей ему в качестве первого параметра имени свойства ( ‘whiskers’ ) и правой части оператора присвоения в качестве второго.

Наконец, __isset и __unset завершают квартет методов для перегрузки свойств. Каждый из них принимает только один параметр – имя свойства, и вызываются при выполнении операций isset() и unset() над этим свойством.

Например, вот такая реализация __call приведет к тому, что при обращении к любому «невидимому» методу будет выполнена полезная нагрузка на whiskersService :

В приведённых выше примерах мы инкапсулировали реализацию whiskers от внешнего мира, сделав его единственным объектом, доступным таким способом. Клиенты определенных нами методов и свойств ничего не знают о базовом классе whiskersService и о том, как вообще Dog хранит свои данные.

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

Используя магические методы, следует помнить, что получаемые выгоды имеют свою цену. Во-первых, эти методы выполняются медленнее, чем обращение к явно определенным публичным свойствам, а также медленнее установщиков и получателей. Во-вторых, они препятствуют применению многих полезных средств, таких как рефлексия, автодополнение в IDE, утилиты автоматической документации (например, PHPDoc). Если эти вещи имеют значение, то, возможно, стоит определить публичные методы и свойства явно. Как и во многих других случаях, на вопрос о том, стоит ли использовать магические методы, однозначно ответить нельзя. Достоинства и недостатки нужно оценивать в каждом конкретном случае.
К списку вопросов

Вопрос: Опишите несколько структур данных из стандартной библиотеки PHP (SPL). Приведите примеры использования.

Процесс разработки на PHP по большей части связан с получением и обработкой данных из разных источников, таких как базы данных, локальные файлы, удаленные API и т.д. Разработчики тратят очень много времени на организацию данных, их получение, перемещение и обработку. Наиболее используемая структура для представления данных на PHP – это массив. Однако в некоторых случаях массивы не годятся для решения задач из-за недостаточной производительности и избыточного потребления памяти, и поэтому требуются более подходящие структуры данных.

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

Применение стандартной библиотеки PHP (Standard PHP Library, SPL) и знание её состава – та область, владение которой может подтвердить компетентность PHP-разработчика. Если у кандидата имеется приличный опыт работы с SPL, то, скорее всего, он сможет успешно работать над вашим приложением, вне зависимости от используемых в вашем окружении фреймворков.

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

SplFixedArray – массив фиксированной длины, индексами которого могут быть только целые числа. Эти ограничению обеспечивают более высокую скорость обработки массива, которая достигается, в том числе, благодаря тому, что в SplFixedArray нет хеширования ключей элементов при их добавлении (в отличие от обычных массивов).

SplObjectStorage – хранилище объектов, предоставляет интерфейс для сопоставления объектов к данным, либо может быть использовано в качестве контейнера для множества объектов. Позволяет использовать объект в качестве ключа ассоциативного массива и связать его с некоторыми данными.

Также о структурах данных из SPL можно почитать на хабре.
К списку вопросов

Правильный ответ – 18. Давайте разберёмся почему.

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

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

Одни программисты считают автоматическое приведение типов ценной особенностью, другие – отвратительным недостатком PHP. С одной стороны, осознанное и правильное его применение добавляет удобства разработчику (нет необходимости писать код для конвертации «15» в 15 перед применением арифметической операции). С другой стороны, оно может легко привести к трудноулавливаемым ошибкам, если будет задействовано случайно (т.к. не будет выдано никаких предупреждений и ошибок).
К списку вопросов

В PHP, начиная с версии 5.3, реализовано позднее статическое связывание. Термин «позднее связывание» означает, что ключевое слово static связывает метод или свойство (к которому происходит обращение через static:: ) не с тем классом, в котором был определён использующий его метод, а с тем, в котором этот метод был вызван во время выполнения. Кстати, название «статическое связывание» не совсем корректно, т.к. static допустимо использовать не только для обращения к статическим членам класса.

Результат выполнения этого кода не удивляет: «собака лает, собака лает».
Расширим пример:

Под капотом PHP

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

Вопрос: Расскажите о внутреннем устройстве массивов в PHP?

С массивами связана значительная часть процесса разработки на PHP. Они хорошо подходят для тех случаев, когда вам необходима итерируемая структура данных. Изнутри массивы представлены, как и многие другие структуры данных, в виде хэш-таблиц. PHP написан на C, в котором нет ассоциативных массивов – массивы в C могут иметь только целочисленные индексы. Для трансляции индексов PHP-массива в целочисленные индексы массива на C применяется хэш-функция, преобразующая индексы PHP-массива (и целочисленные, и строковые) в целые числа. Значения элементов массива располагаются в получившейся хеш-таблице.
Сложность процесс поиска элементов по хэш-ключам составляет O(1) (в нотации большое О) благодаря тому, что для нахождения элемента не требуется итерация по хешу (хеш-функция возвращает значение, точно указывающее на положении элемента в таблице).

Прим. переводчика: Здесь я сознательно исключил из текста понятие бакета (bucket, корзина), т.к. автор оригинального текста не даёт никаких пояснений на его счет. Если вам действительно интересно устройство хеш-таблиц, то рекомендую к прочтению вот этот материал.

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

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

Сначала объявим сам генератор:

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

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

Если запустить этот код, то он прекратит своё выполнение после обнаружения терьера:

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

Общая картина

Вопрос: Перечислите ключевые отличия между версиями PHP 5.3, 5.4, 5.5.

Версия PHP 5.3 была выпущена в июне 2009 года, но до сих пор широко распространена. Основные новшества: замыкания, лямбда-функции, пространства имён и позднее статическое связывание.

Подведём итоги

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *