PHP Patterns

Вопросы и ответы для собеседования php (Junior)

Общие вопросы

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

Ссылки в PHP — это способ получить доступ к одной и той же переменной (области памяти) под разными именами.

function increment(int &$value)
{
    $value++;
}

$count = 2;

increment($count);

echo $count; // 3


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


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

  • bool (логический)
  • int (целое число)
  • float (дробное число)
  • string (строка)
  • array (массив)
  • object (объект)
  • callable (функция)
  • mixed (любой тип)
  • resource (ресурс)
  • null (отсутствие значения)


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

Инкремент - увеличение значения на 1. Декремент - уменьшение значения на 1.

Префиксный инкремент - Увеличивает $value на единицу, затем возвращает значение $value.
Постфиксный инкремент - Возвращает значение $value, затем увеличивает $value на единицу.
Префиксный декремент - Уменьшает $value на единицу, затем возвращает значение $value.
Постфиксный декремент - Возвращает значение $value, затем уменьшает $value на единицу.

$value = 10;

echo $value++; // 10 Постфиксный инкремент
echo $value; // 11
echo $value--; // 11 Постфиксный декремент
echo $value; // 10

echo ++$value; // 11 Префиксный инкремент
echo --$value; // 10 Префиксный декремент

Подробнее


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

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


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

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

== - оператор не строго сравнения(сравнивает значения, не сравнивает тип переменных).

echo '1' == 1; // true

=== - оператор строго сравнения(сравнивает значения, сравнивает тип переменных).

echo '1' === 1; // false


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

Инкапсуляция. Это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает их от внешнего вмешательства или неправильного использования. Когда методы и данные объединяются таким способом, создается объект. Т.е. переменные состояния объекта скрыты от внешнего мира. Изменение состояния объекта (его переменных) возможно ТОЛЬКО с помощью его собственных методов. Можно сказать, что инкапсуляция подразумевает под собой сокрытие данных, что позволяет эти данные защитить.

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

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


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

Языки программирования делятся по типизации: динамическая (dynamic typing) и статическая (static typing).

Статическая типизация - когда тип переменной точно известен и он не меняется во время выполнения программы не изменен. С динамической типизацией переменная может менять тип во время исполнения.

Типизация, в свою очередь, делится на сильную (strong typing) и слабую (weak typing). Когда мы выполняем какую-либо операцию при сильной типизации, то два операнда должны иметь один и тот же тип.


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

mysql_connect - Открывает соединение с сервером MySQL. mysql_pconnect - Устанавливает постоянное соединение с сервером MySQL. Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL.


Что такое интерфейсы?

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

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


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

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


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

public - свойство или метод доступны отовсюду. Это значение по умолчанию. protected - к свойству или методу можно получить доступ внутри класса и классов, производных от этого класса. private - свойство или метод могут быть доступны только внутри класса.


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

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

construct(), destruct(), toString(), invoke(), __clone() и др.


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

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


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

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


Что такое traits? Альтернативное решение?

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

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

Подробнее


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

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

Блок catch определяет, как реагировать на выброшенное исключение. Блок catch определяет один или несколько типов исключений или ошибок, которые он может обработать, и, по желанию, переменную, которой можно присвоить исключение (указание переменной было обязательно до версии PHP 8.0.0). Первый блок catch, с которым столкнётся выброшенное исключение или ошибка и соответствует типу выброшенного объекта, обработает объект.

Блок finally также может быть указан после или вместо блоков catch. Код в блоке finally всегда будет выполняться после блоков try и catch, независимо от того, было ли выброшено исключение и до возобновления нормального выполнения.


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

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

Строгое типизирование - это проверка типа переменной при передачи параметра функции. Любое несоотвествие приводит к ошибке или notice. Мягкое типизирование - это проверка как по типу (запрет передачи array вместо integer), так и возможность автоматической конвертации определённых типов (об этом подробнее дальше).


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

namespace - это один из способов инкапсуляции элементов. Такое абстрактное понятие можно увидеть во многих местах. Например, в любой операционной системе директории служат для группировки связанных файлов и выступают в качестве пространства имён для находящихся в них файлов. В качестве конкретного примера файл foo.txt может находиться сразу в обеих директориях: /home/greg и /home/other, но две копии foo.txt не могут существовать в одной директории. Кроме того, для доступа к foo.txt извне директории /home/greg, мы должны добавить имя директории перед именем файла используя разделитель, чтобы получить /home/greg/foo.txt. Этот же принцип распространяется и на пространства имён в программировании.

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

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


Сравнение значений переменных в РНР и подводные камни? Приведение типов.

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

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


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

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

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

По умолчанию PHP использует внутренний обработчик files для сохранения сессий, который установлен в INI-переменной session.save_handler. Этот обработчик сохраняет данные на сервере в директории, указанной в конфигурационной директиве session.save_path.

Подробнее


Суперглобальные массивы

Суперглобальные переменные - встроенные переменные, которые всегда доступны во всех областях. Суперглобальными переменными являются: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV


Как получить тело запроса из PUT запроса

php://input - это поток, который обеспечивает доступ к необработанному тексту запроса.

if ($_SERVER['REQUEST_METHOD'] == 'PUT') {
    print_r(file_get_contents("php://input"));
}


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

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

include_once включает и выполняет указанный файл во время выполнения скрипта. Его поведение идентично выражению include, с той лишь разницей, что если код из файла уже один раз был включён, он не будет включён и выполнен повторно и вернёт true. Как видно из имени, он включит файл только один раз. require_once аналогично require за исключением того, что PHP проверит, включался ли уже данный файл, и если да, не будет включать его ещё раз.


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

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

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

Подсказки, которые помогут определить сложность алгоритма:

  • Получение элемента коллекции это O(1). Будь то получение по индексу в массиве, или по ключу в словаре в нотации Big O это будет O(1).
  • Перебор коллекции это O(n).
  • Вложенные циклы по той же коллекции это O(n2).
  • Разделяй и властвуй (Divide and Conquer) всегда O(log n).
  • Итерации которые используют “Разделяй и властвуй” (Divide and Conquer) это O(n log n).

Подробнее(с примерами): https://bimlibik.github.io/


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

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

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

Подробнее(с примерами): https://www.php.net/manual/ru/functions.anonymous.php


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

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


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

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

Подробнее(с примерами): https://www.php.net/manual/ru/language.oop5.late-static-bindings.php


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

В файле php.ini.

Например, храним сессии в memcached:

session.save_handler = memcached
session.save_path = "memcachedhost:11211"

Или храним сессии в redis:

session.save_handler = redis
session.save_path = "tcp://redishost:6379?auth=redis_user_password&prefix=prefix_for_session_keys"

Если нужен свой обработчик, есть SessionHandler. Это специальный класс, который может использоваться для дополнения внутреннего обработчика сессий PHP путём создания дочерних классов от этого. Существует семь методов, которые являются обёртками над семью внутренними обработчиками хранения данных сессии (open, close, read, write, destroy, gc и create_sid). По умолчанию этот класс оборачивает все внутренние обработчики хранения сессии, определённые в опции конфигурации session.save_handler. Эта опция по умолчанию имеет значение files.

Подробне: https://www.php.net/manual/ru/class.sessionhandler.php


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

Стандартная библиотека PHP (SPL) - это набор интерфейсов и классов, предназначенных для решения стандартных задач.

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

Примеры использования класса Reflection: https://www.php.net/manual/ru/class.reflection.php

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

Наборы: Двусвязные списки Кучи Массивы Карта


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

SOLID - пять принципов объектно-ориентированного программирования и проектирования.

  • S: Single Responsibility Principle (Принцип единственной ответственности).
  • O: Open-Closed Principle (Принцип открытости-закрытости).
  • L: Liskov Substitution Principle (Принцип подстановки Барбары Лисков).
  • I: Interface Segregation Principle (Принцип разделения интерфейса).
  • D: Dependency Inversion Principle (Принцип инверсии зависимостей).

Подробнее: wikipedia.org, https://habr.com/ru/companies/productivity_inside/articles/505430/

Git

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

git add your/file_name


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

git add commit -m 'bug fix'


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

git push origin your-branch-name

Composer

Что такое Composer?

Composer — менеджер PHP пакетов.

Подробнее: https://habr.com/ru/articles/439200/


Чем отличается require от require-dev?

В require прописаны все необходимые зависимости этого пакета или приложения. Установятся в любом случае.

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

composer install --no-dev
Egor Udaltsov 2024-01-31 18:48

Очень вовремя попалось! Спасибо)

Авторизуйтесь, что бы оставить комментарий!