Вы находитесь на странице: 1из 50

Отвечаем на 100+ вопросов собеседования для PHP

программиста
#develop/sprout

Junior
Общие вопросы
1. Что такое ссылки?

Средство доступа к содержимому одной переменной под разными именами

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

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

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

Скалярные:

boolean (логический тип)


integer (целые числа)
double (дробные числа)
string (строки)
Составные:
array (массивы)
object (объекты)
Специальные:
resource (ресурсы)
null

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

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


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

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

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

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

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

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

Инкапсуляция. Скрытие внутреннего состояния и функций объекта и предоставление доступа только через открытый
набор функций
Наследование. Возможность создания новых абстракций на основе существующих
Полиморфизм. Возможность реализации наследуемых свойств или методов отличающимися способами в рамках
множества абстракций
Абстракция. Моделирование требуемых атрибутов и взаимодействий сущностей в виде классов для определения
абстрактного представления системы

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

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

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

mysql_pconnect() (link is external)работает аналогично mysql_connect() (link is external) с двумя важными отличиями.

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

Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется
рабочим для будущего использования ( mysql_close() также не закрывает постоянные соединения, открытые
mysql_pconnect()).

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.

function xrange($start, $limit, $step = 1) {


if ($start <= $limit) {
if ($step <= 0) {
throw new LogicException('Шаг должен быть положительным');
}

for ($i = $start; $i <= $limit; $i += $step) {


yield $i;

}
} else {
if ($step >= 0) {
throw new LogicException('Шаг должен быть отрицательным');
}
for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}

echo 'Нечётные однозначные числа с помощью range(): ';


foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";

echo 'Нечётные однозначные числа с помощью xrange(): ';


foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}

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

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

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

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

trait Magic
{
// Доступно только внутри трейта
private $properties;

public function __get($key)


{
return $this->properties[$key] ?? null;
}

public function __set($key, $value)


{
$this->properties[$key] = $value;
}
}

class Config
{
// Включение трейта в класс
use Magic;
}

$config = new Config();


$config->key = 'value';
echo $config->key;

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

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

Вызов дочернего метода


Вызов метода трейта
Вызов у родительского класса

class Base {
public function sayHello()
{
echo 'Hello ';
}
}

trait SayWorld {
public function sayHello()
{
echo 'SayWorld!';
}
}

trait SayHello {
public function sayHello()
{
echo 'SayWorld!';
}

private function saySome()


{
echo 'SaySome!';
}
}

class MyHelloWorld extends Base


{
use SayWorld, SayHello {
SayHello::sayHello insteadOf SayWorld;
}

public function sayForTrait()


{
$this->saySome();
}
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayForTrait();

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

Да

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

Да

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

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

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

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

Namespace - это механизм использование класса через пространство имен

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

Есть некотрые особенности привелдения типов таких как:


string в int , int в bool и так далее. Может зависть от гибкое/жесткое сравнение. Пример:
$a = [];

var_dump(empty($a));
var_dump(isset($a));
// Какое значение выведеться в консоли ?

Таблица сравнений типов в PHP:


https://www.php.net/manual/ru/types.comparisons.php

declare(strict_types=1);

PHP8:

union types
Типы null и false можно использовать отдельно (возвращаемый тип)
Возвращаемый тип static
mixed
...

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

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

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

$SERVER, $REQUEST, $GET, $POST


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

include - при отcутствии скрипта в подключенном файле не выдает ошибку, require - выдает. include_once, required_once -
подключает файл единожды.

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

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

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

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

$a = 8;
$b = 10;

$closure = function($c) use($a, $b)


{
return $a + $b + $c;
};

$result = $closure(22); // 40
echo $result;

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

В PHP замыкание может быть использовано только с использованием анонимных функций, в то время как в JavaScript
замыкание может быть создано с помощью любой функции. Кроме того, в JavaScript замыкание может быть использовано
для создания приватных переменных и методов, что невозможно в PHP.
31. Что такое позднее связывание? Расскажите о поведении и применения static.

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

static::method()

class A {
public static function who() {
print(__CLASS__) . PHP_EOL;
}
public static function test() {
self::who();
}

public static function testStatic() {


static::who();
}
}

class B extends A {
public static function who() {
print(__CLASS__) . PHP_EOL;
}
}

B::test();
B::testStatic();

// A
// B
Может использоваться в проектировании паттернов в контексте наследования.

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

В опции конфигурации session.save_handler .

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

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

Проще говоря, это сервисные классы php, которые предоставляют стандартизированные объекты для работы со
структурами данных. Так же описывают стндарт загрузки библиотек. Что позволяет пользоваться сторонними
модулями(библиотеками).

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

S: Single Responsibility Principle (Принцип единственной ответственности).


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

Note

Здесь лучше всего описать своимим словами, так как понимаете именно вы. Еще желательно опыт применения. В
каких случаях уместно.

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


GRASP — General Responsibility Assignment Software Patterns (основные шаблоны распределения обязанностей в
программном обеспечении)
GRASP состоит из 9 шаблонов:

Creator
Controller
Pure Fabrication
Information Expert
High Cohesion
Indirection
Low Coupling
Polymorphism
Protected Variations

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

Внедрение зависимостей — это когда один объект предоставляет зависимости другому объекту.
Одним из ключевых моментов инверсии зависимостей является динамическое обеспечение объекта другими
необходимыми ему объектами в системе. Это делается через DIC (контейнер внедрения зависимостей).

declare(strict_types=1);

class DatabaseConfiguration
{
const HOST = 'localhost';
const PORT = 80;
const USERNAME = 'laravel';
const PASSWORD = 'password';

public function __construct(


private string $host = self::HOST,
private int $port = self::PORT,
private string $username = self::USERNAME,
private string $password = self::PASSWORD
) {
}

public function getHost(): string


{
return $this->host;
}

public function getPort(): int


{
return $this->port;
}

public function getUsername(): string


{
return $this->username;
}

public function getPassword(): string


{
return $this->password;
}
}

class DatabaseConnection
{
public function __construct(private DatabaseConfiguration $configuration)
{
}
public function getDsn(): string
{
return sprintf(
'%s:%s@%s:%d',
$this->configuration->getUsername(),
$this->configuration->getPassword(),
$this->configuration->getHost(),
$this->configuration->getPort()
);
}
}

$dbConf = new DatabaseConfiguration();


$dbConnect = new DatabaseConnection($dbConf);
echo $dbConnect->getDsn();

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

Model View Controller - архитектурный паттерн, который разделяет логику от модели и представления.

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

Паттерны "Банды 4" которые решают самые частые и повторяющийся проблемы проектирования архитектуры. Они есть
трех видов:
- Порождающие
- Структурные
- Поведенческие

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

Есть шаблон Active Record и Data Maper


40. Напишите на PHP пример реализации паттерна Singleton.

class Singleton
{
private static $instance = null;

private function __construct() {}

/**
* @return Singleton
*/
public static function getInstance()
{
if (self::$instance === null)
{
self::$instance = new self();
}
return self::$instance;
}
private function __clone() {}

public function test()


{
var_dump($this);
}
}
$Object = Singleton::getInstance(); // Получение объекта
//Вывод будет одинаковым, так как существует только один экземпляр
$Object->test();
Singleton::getInstance()->test();
// Попытка создать дополнительный экземпляр приведет к ошибке
$Object2 = new Singleton(); // Fatal error: Call to private Singleton::__construct() from invalid context
$Object3 = clone $Object; // Fatal error: Call to private Singleton::__clone() from context ''
41. Что такое Docker? Каков принцип его работы?

Docker — это платформа, которая позволяет упаковать в контейнер приложение со всем окружением и зависимостями, а
затем доставить и запустить его в целевой системе. Приложение, упакованное в контейнер, изолируется от операционной
системы и других приложений.

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

SSH (от англ. secure shell ― безопасная оболочка) ― это защищённый сетевой протокол для удалённого управления
сервером через интернет.
Сетевой протокол прикладного уровня, предназначеный для безопасного удаленного доступа к UNIX-системам. Данный
протокол эффективен тем, что шифрует всю передаваемую информацию по сети.

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

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

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

JIT компилятор
Аннотации/Атрибуты (Attributes)
Именованные параметры (Named Arguments)
Оператор выбора match (Match expression v2)
Адекватное приведение строки в число (Saner string to number comparisons)
Constructor Property Promotion
Объединения типов (Union Types 2.0)

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


Основное отличие метода GET от POST в способе передачи данных. Запрос GET передает данные в URL в виде пар "имя-
значение" (другими словами, через ссылку), а запрос POST передает данные в теле запроса

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

Строки с двойными и одинарными кавычками отличаются тем: Подстановкой переменных: в строку с двойными
кавычками значение переменной подставляется, а в строчку с одинарными нет

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

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

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

Конфеденциальные данные. Нельзя, потому что есть риск получить файл cookie злоумышленником.

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

IDE PHPStorm - основная


VSCODE - вспомогательная

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

git add .

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

git commit -m
52. Какой командой отправить изменения в удаленный репозиторий?

git pull

53. Каковы преимущества системы контроля версий?

Это полезно при совместной работе в команде


Это помогает интегрировать код автоматизации в конвейер CI/CD
Это помогает на раннем этапе тестирования конкретной функции путем проверки ветки функции

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

Как git merge, так и git rebase интегрируют изменения из одной ветки в другую ветку. Git rebase применяет все изменения
ветки функций поверх основной ветки, создавая новую фиксацию для каждой из ее предыдущие сообщения фиксации.
Команда rebase изменяет историю коммитов и снова создает коммиты поверх главной ветки.

Базы данных
55. Что такое транзакция?

Транзакция представляет собой последовательность операторов языка SQL, которая рассматривается как некоторое
неделимое действие над базой данных

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

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

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


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

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

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

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

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

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

Первичный ключ: набор определенных признаков, уникальных для каждой записи. Обозначается первичный ключ, как
primary key.
Внешний ключ (Foreign key, кратко FK). Обеспечивает однозначную логическую связь, между таблицами одной БД.

63. В чем разница между первичным и уникальным ключами?

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

64. Какие есть типы JOIN и чем они отличаются?


Вот здесь пригодияться знания из теории множеств

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

Агрегатные функции - для того, что бы обобщить полученные данные.


SUM, AVG, MIN, MAX

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

Миграция данных (Data Migration):

Разовое массовое перемещение данных из систем-источников в систему-приемник. Эксплуатация данных в системах-


источниках при этом прекращается.
Процесс преобразования БД, при котором меняется схема БД от одной версии до другой. Миграция подразумевает
как прямое изменение БД (апгрейд, db_upgrade), так и обратное изменение (даунгрейд, db_downgrade).

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

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

Связь "один ко многим" (one-to-many) означает, что каждый элемент в одной группе (таблице) может соответствовать
нескольким элементам в другой группе (таблице), но каждый элемент в другой группе (таблице) соответствует только
одному элементу в первой группе (таблице). Примером может служить отношение между родителями и детьми: каждый
родитель может иметь несколько детей, но каждый ребенок имеет только двух родителей.

Связь "многие ко многим" (many-to-many) означает, что каждый элемент в одной группе (таблице) может соответствовать
нескольким элементам в другой группе (таблице), и каждый элемент в другой группе (таблице) может соответствовать
нескольким элементам в первой группе (таблице). Примером может быть отношение между учениками и предметами в
школе: каждый ученик может изучать несколько предметов, и каждый предмет может быть изучаем несколькими
учениками.

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

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

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

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

Главное отличие HAVING от WHERE в том, что в HAVING можно наложить условия на результаты группировки, потому что
порядок исполнения запроса устроен таким образом, что на этапе, когда выполняется WHERE, ещё нет групп, а HAVING
выполняется уже после формирования групп.

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

Distinct - возвращает уникальные значения, GroupBy - группирует ВСЕ значения.

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

Операторы UNION, INTERSECT и EXCEPT используются для объединения, пересечения и вычитания данных из двух или
более таблиц.

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

Datetime представляет из себя дату, как в календаре и время, которое мы видим на часах, в нашей временной зоне.
Timestamp же представляет из себя время, точно определённое для всех, ведь в мире много временных зон.
Пример:
Как много прошло времени начиная с 2013-01-10 14:45:32? Зависит от того, в какой временной зоне вы находитесь. Если
же спросить, сколько это 1492256793.49 секунд начиная с 1970-01-01 00:00:00 UTC — мы можем точно сказать,
сконвертировав timestamp в обычное время с учётом нашей временной зоны.

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

Диапазон значений:

DATETIME: допускает значения от '1000-01-01 00:00:00' до '9999-12-31 23:59:59'.


TIMESTAMP: допускает значения от '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' UTC. Значения TIMESTAMP
обычно представляют количество секунд, прошедших с начала эпохи UNIX (1 января 1970 года 00:00:00 UTC).

Хранение:

DATETIME: занимает 8 байт и представляет дату и время в формате 'YYYY-MM-DD HH:MI:SS'.


TIMESTAMP: занимает 4 байта и хранит количество секунд с начала эпохи UNIX. Он может быть автоматически
обновлен при изменении строки.

Автоматическое обновление:

DATETIME: не обновляется автоматически.


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

Часовые пояса:

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

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

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

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

InnoDB: Транзакционный тип движка, применяемый при интенсивных операциях записи, спасибо возможности блокировки
уровня строк таблицы. Великолепная восстанавливаемость и высокая надежность хранения данных. Движок InnoDB был
приобретен Oracle в 2005 году.

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

Существует множество способов оптимизации производительности баз данных. Вот некоторые из них:

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

Оптимизация запросов: Проверьте и оптимизируйте свои SQL-запросы, чтобы улучшить их производительность.


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

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

Кэширование: Используйте кэширование для временного хранения часто запрашиваемых данных, чтобы избежать
излишних обращений к базе данных. Это может быть реализовано с помощью инструментов кэширования на уровне
приложения или с помощью кэшей на уровне базы данных, таких как Redis или Memcached.

Партиционирование: Разделение больших таблиц на небольшие физические разделы (партиции) может улучшить
производительность запросов и упростить управление данными.
Оптимизация структуры таблиц: Избегайте хранения больших объемов данных в одной таблице. Разделите таблицы на
более мелкие, чтобы ускорить запросы и облегчить администрирование.

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

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

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

Мониторинг и профилирование: Постоянно отслеживайте производительность базы данных, используя инструменты


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

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

Партиционирование — это разбиение таблиц, содержащих большое количество записей.


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

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

MongoDB

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


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

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

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

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

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

Функции - это примерно тоже самое, что и процедуры, за исключением того, что в функции мы всегда делаем return.

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

Организация сохранности вложенных категорий в MySQL может быть достигнута с использованием двух основных
подходов: "Материализованный путь" (Materialized Path) и "Список смежности" (Nested Set).

Материализованный путь (Materialized Path):


В этом подходе каждая категория имеет поле, которое содержит путь к данной категории. Путь представляет собой
строку, в которой каждая категория идентифицируется своим уникальным идентификатором и разделена
специальным разделителем. Например, путь к категории "Электроника → Телефоны → Смартфоны" может быть
представлен как "1/5/9".
При этом подходе, чтобы найти все вложенные категории, можно использовать оператор LIKE для поиска всех
категорий, путь которых начинается с определенного значения.
Преимущества:
Простота реализации
Легкость добавления и перемещения категорий
Недостатки:
Затраты на обновление пути при перемещении категорий
Ограничение на глубину вложенности
Список смежности (Nested Set):
В этом подходе каждая категория имеет поля, указывающие на ее родительскую категорию и позицию внутри этой
родительской категории. Категории организованы в виде иерархической структуры, где каждая категория имеет
левую и правую границы, которые определяют ее положение относительно других категорий.
При этом подходе, чтобы найти все вложенные категории, можно использовать оператор BETWEEN для поиска всех
категорий, у которых левая и правая границы находятся внутри границы родительской категории.
Преимущества:
Возможность хранения иерархии с любой глубиной вложенности
Быстрый поиск всех дочерних категорий
Недостатки:
Сложность при перемещении категорий и поддержке целостности данных
Затраты на обновление границ при добавлении или удалении категорий

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

Laravel
81. Какие есть связи и как они реализуются в Laravel?

https://laravel.com/docs/10.x/eloquent-relationships
82. Что такое полиморфные связи, как они работают?

Полиморфные связи — это динамические связи между таблицами с использованием типа сущности.
83. Что такое middleware? Зачем это? На каком этапе выполняется?

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

Composer
84. Что такое Composer?

Composer — это популярный менеджер зависимостей PHP, который упрощает процесс установки и обновления
зависимостей проекта.

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

Require содержит все, что нужно вашему проекту для запуска в проде, тогда как require-dev определяет дополнительные
требования для разработки.

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

Для хранения информации о книгах и авторах в базе данных можно создать две таблицы: "Authors" (Авторы) и "Books"
(Книги).

Таблица "Authors" может содержать следующие столбцы:

author_id (идентификатор автора, первичный ключ)


author_name (имя автора)

Таблица "Books" может содержать следующие столбцы:


book_id (идентификатор книги, первичный ключ)
book_title (название книги)
author_id (идентификатор автора, внешний ключ, связанный с таблицей "Authors")

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

SELECT authors.name, COUNT(books.id) AS book_count


FROM authors
LEFT JOIN books ON authors.id = books.author_id
GROUP BY authors.name;

Этот запрос объединяет таблицы "authors" и "books" по идентификатору автора. Затем он группирует результаты по имени
автора и подсчитывает количество книг, написанных каждым автором. Результатом будет список авторов и
соответствующее количество их книг.
87. Есть матрица 3×3. Посчитайте сумму диагоналей.

function sumDiagonalMatrix(array $matrix, int $val = 0): int {


foreach ($matrix as $key => $value) {
if ($key === 0) {
$val += $value[0];
}
if ($key === 1) {
$val += $value[1];
}
if ($key === 2) {
$val += $value[2];
}
}

foreach ($matrix as $key => $value) {


if ($key === 0) {
$val += $value[2];
}
if ($key === 1) {
$val += $value[1];
}
if ($key === 2) {
$val += $value[0];
}
}

return $val;
}

$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];

var_dump(sumDiagonalMatrix($matrix));

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

Иду смотреть в логи

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

if (-1) {
print "True";
} else {
print "False";
}

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

$a = 3; $b = 2;
echo (int) $a / (int) $b;

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

var_dump (array_merge ([2 => 'a'], [3 => 'b']));

92. Чему равны выражения:

print (!! "false")


print (!! true)
print ((int) '125g7')
print ((int) 'x52')

93. Каков результат выполнения функции? Как исправить результат?

in_array (1, [0, '0', true])

Middle
Общие вопросы
1. Как передаются переменные (по значению или по ссылке)?

По значению

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

Браузер посылает HTTP запрос к серверу, запрашивая его отправить копию сайта для клиента. Это сообщение и все
остальные данные, передаваемые между клиентом и сервером, передаются по интернет-соединению с использованием
протокола TCP/IP.

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

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

someMethod(...$arguments);

4. Что такое OWASP?


Open Web Application Security Project® (OWASP) – открытый проект по обеспечению безопасности приложений, все
материалы которого доступны бесплатно на веб-сайте некоммерческой организации OWASP® Foundation. Поставляемые
материалы включают документацию, мероприятия, форумы, проекты, инструменты и видео, такие как OWASP Top 10, веб-
протоколы OWASP CLASP и OWASP ZAP, а также сканер веб-приложений с открытым исходным кодом.

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

Виды уязвимостей PHP

Демонстрация ошибок пользователю

Доступность данных о характеристиках системы пользователю

Доступность данных о программном коде пользователю

Простые пароли для доступа к административным страницам

Возможность задания глобальных переменных

PHP-инъекция

PHP-инъекция через загрузку файлов

e-mail-инъекция

SQL-инъекция

Межсайтовый скриптинг или XSS

Блокирование вывода ошибок


Для этого достаточно в программном коде задать error_reporting(0) или в файле .htaccess добавить строку php_flag
error_reporting 0
Использование сложных паролей для доступа к административным страницам
Для этого достаточно использовать многозначные пароли, не имеющие семантического значения (например, К7O0iV98dq).

Логирование критических действий пользователя


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

function writelog($typelog, $log_text) {<br/>


$log = fopen('logs/'.$typelog.'.txt','a+');<br/>
fwrite($log, "$log_text\r\n");<br/>
fclose($log);<br/>
}<br/>
writelog('authorization', date("y.m.d H:m:s")."\t".$_SERVER['REMOTE_ADDR']."\tУспешный вход");

Закрытие доступа к модулям сайта


Обеспечивает защиту от попыток просмотра их содержимого или выполнения. Для этого достаточно в файле .htaccess
настроить доступ к файлам модулей при помощи конструкций FilesMatch и Files.
Например, мы закрываем доступ ко всем модулям с расширением php, кроме файла capcha.php:
image

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


Для этого достаточно в настройках сервера задать register_globals = off; или в файле .htaccess добавить строку php_flag
register_globals off. Использование ini_set('register_globals',0); проблему не решит так, как переменные задаются до начала
выполнения скрипта.

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


Для этого достаточно в настройках сервера задать allow_url_fopen = off;. Это обеспечивает частичную защиту от PHP-
инъекций, но не полную, так как взломщик может передавать не ссылку на файл с программным кодом, а сам
программный код. Для полной защиты от PHP-инъекций необходимо дополнительно использовать фильтрацию
поступивших данных. Иногда данную меру защиты невозможно использовать из-за особенностей работы проекта (нужно
обращаться к удалённым файлам).

Фильтрация поступающих данных


Обеспечивает защиту от большенства уязвимостей. Универсального решения не существует. Желательно использовать
проверку по «белому» списку символов в совокупности с проверкой на запрещённые слова. «Белым» называется список
разрешенных символов. В этот список не должны входить опасные символы, например, <>. К запрещённым словам можно
отнести: script, http, SELECT, UNION, UPDATE, exe, exec, INSERT, tmp, а также html-теги.
Пример фильтрации поступающих данных:

// Проверка по белому списку. Допускаются только русские и латинские буквы, цифры и знаки _- <br/>
if (preg_match("/[^(\w)|(А-Яа-я-)|(\s)]/",$text)) {<br/>
$text = '';<br/>
}<br/>
// Фильтрация опасных слов<br/>
if (preg_match("/script|http|<|>|<|>|SELECT|UNION|UPDATE|exe|exec|INSERT|tmp/i",$text)) {<br/>
$text = '';<br/>
}

Проверка на загрузку файла при помощи HTTP POST


Обеспечивает защиту от PHP-инъекций через загрузку файлов. Для обеспечения этого загруженные на сервер файлы
необходимо проверять функцией is_uploaded_file() или перемещать функцией move_uploaded_file(). Данный вид защиты
можно не использовать, если отключена возможность задания глобальных переменных.
Экранирование символов кавычек данных, передаваемых в базу данных
Обеспечивает защиту от SQL-инъекций. Наиболее оптимальным методом является обработка всех поступивших не
числовых данных с помощью функции mysql_real_escape_string(). Можно так же использовать автоматическое
экранирование, поступающих данных. Для этого достаточно в файле .htaccess добавить строку php_value
magic_quotes_gpc on, но этот способ не является надёжным, так как может привести к двойному экранированию.
Пример экранирования кавычек с помощью функции mysql_real_escape_string():
if (!is_numeric(text)) {<br/> $textrequest = mysql_real_escape_string(text);
}

Преобразование специальных символов в html-сущности перед выводом


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

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

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

Методы GET, HEAD, OPTIONS и TRACE определены как безопасные, что также делает их идемпотентными.

7. Что такое stateless?

"Отсутствие состояния"

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

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

REST — это архитектурный стиль. SOAP — это формат обмена сообщениями.

Пример реализации RESTful: JSON через HTTP


Пример реализации SOAP: XML поверх SOAP через HTTP

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


API ключ
Basic Auth
HMAC
OAuth 2.0

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

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

11. Что такое PSR?

Стандарт написания PHP кода

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

class RemoteRepository
{
public function __construct(private \Psr\Http\Client\ClientInterface $httpClient)
{
}

public function getMovies(string $imdbId): ?array


{
$response = $this->httpClient->sendRequest($imdbId);

return json_decode($response->getBody()->getContents(), true);


}
}

<?php
$client = new \GuzzleHttp\Client();
$repository = new RemoteRepository($client);

$movies = $repository->getMovies('tt39105467134');

13. Что такое Redis?

Хранилище данных в памяти

14. Как хранятся данные в Redis / Memcached?

В формате key:value

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

Для кеширования (быстрый доступ к данным)


Дополнительный сервис для приложения

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

Метод обработки соединений с клиентами


Отдаваемый контент
Конфигурирование
Работа с модулями
Интерпретация запросов
Работа со скриптовыми языками
Скорость работы
Поддержка ОС
Сообщество и поддержка
Документация и обучение
Выбирайте всегда nginx

17. Что такое Opcash? Как он работает?

OPcahce — это расширение для PHP, которое ускоряет работу за счёт кэширования опкодов.

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

JIT – это выполнение кода и его компиляция по принципу «just in time». Соответствующая операция подразумевает
компилирование кода не до выполнения программного обеспечения, а тогда, когда это необходимо.

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

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

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

Хорошие практики написания кода

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

Facade
Builder
Fabrica
Bridge
Abstract Fabrica

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


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

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

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

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

Стандартный жизненный цикл состоит из следующих пунктов: HTTP-запрос через Роуты (Routes) поступает в Контроллер
(Controller) Контроллер осуществляет некоторые действия в зависимости от запроса и передает данные в Отображения
(Views) Отображения отображают полученные данные заданным образом, обеспечивая HTTP-ответ.

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

Организации и хранения данных.

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

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

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

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

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

Для фоновых задач. По сути очередь - это та же бд только после выполнения очереди запись о ней удаляется.
29. Как в общих чертах работает OPcache?

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

30. Что такое TDD?

Разработка через тестирование. Хорошая вещь, но на практике (к сожалению) почти никто ей не придерживается.

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

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

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

Этот механизм работает так: если интерпретатор наталкивается на использование класса, то он проверяет, определили ли
вы автозагрузчик классов, и, если определили, то вызывает его (пример). Composer определяет такой загрузчик
автоматически. Его можно конфигурировать с помощью файла composer. json .

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

Senior
Общие вопросы
1. Как вы понимаете REST?

Архитектурный паттерн для построения интерфейсов общения между запросами

2. Что такое Copy-on-write?

При чтении области данных используется общая копия, в случае изменения данных — создается новая копия.
3. Что такое позднее статическое связывание?

Вызов метода в контексте текущего класса

4. Что такое cohesion и coupling?

Связанность (coupling) и связность (cohesion) являются одними из основных характеристик качества проектируемой
системы (в частности программной системы).

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

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

Связанность (coupling) и связность (cohesion) используются не только при проектировании программных комплексов, а
являются общесистемными характеристиками и применимы при синтезе любых систем.

7. Стоит ли возвращать null из методов? Если нет, то почему и как писать код в таких случаях?

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

8. Какой подход следует применить во время тестирования кода, имеющего внешние зависимости
(например, обращение к API Google)?

Можно рассмотреть моки


9. Что такое DDD?

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

10. Что такое микросервисная архитектура?

Это подход, который помогает не только ускорить разработку продукта, но и сделать ее гибкой и управляемой: проект из
неделимого целого превращается в систему связанных между собой блоков — сервисов. Одним из главных принципов
явялется "независимость" и "изолированность" сервиса.

11. Какие есть способы коммуникации между микросервисамы?

API
Брокеры сообщений

12. Что такое фильтр Блума?

Фильтр Блума — это структура данных, цель которой — быстро проверить, что элемент НЕ входит в множество

13. Зачем нужно кэширование? Какую проблему оно решает?

Быстрый доступ к данным. Решает проблемы с производительностью веб приложений.

14. Какие виды кеш-хранилищ вы знаете и применяли? Чем они отличаются?

Redis

15. Чем характеризуется эффективность кэширования?

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

17. Коротко расскажите об истории PHP. Что появлялось в каждой версии? Куда развивается PHP на ваш
взгляд? Что нового в последней версии?

18. Как в PHP очистить память?

unset()

19. Что такое антипаттерны? Приведите несколько примеров.

Singleton

20. Как сделать рефакторинг большого legacy-проекта? Как это аргументировать / продать PM-у,
заказчику?

21. По какому принципу будете выбирать архитектуру для своей будущей программы?
22. С какими видами архитектуры приложений сталкивались?

Монолит
Модульная
Сервисная
Микросервисная

23. Структуры данных. Какие знаете, какие использовали на практике?

Array
Stack
Queue
Cortege
....
Все по немногу

Вам также может понравиться