Академический Документы
Профессиональный Документы
Культура Документы
программиста
#develop/sprout
Junior
Общие вопросы
1. Что такое ссылки?
Есть три основных операции с использованием ссылок: присвоение по ссылке, передача по ссылке и возврат по ссылке.
Скалярные:
4. Что такое инкремент и декремент, в чем разница между префиксным и постфиксным инкрементом и
декрементом?
= - оператор присвоения
== - оператор определяет нестрогое сравнение
=== - оператор строгого сравнение. Эквивалентное сравнение (типы переменных и их значения должны строго совпадать)
Инкапсуляция. Скрытие внутреннего состояния и функций объекта и предоставление доступа только через открытый
набор функций
Наследование. Возможность создания новых абстракций на основе существующих
Полиморфизм. Возможность реализации наследуемых свойств или методов отличающимися способами в рамках
множества абстракций
Абстракция. Моделирование требуемых атрибутов и взаимодействий сущностей в виде классов для определения
абстрактного представления системы
Используется динамическая система типов. Плюсы: в быстрой разработке и прототипировании. Минусы: наличие ошибок
и утяжеление дебаггинга.
mysql_pconnect() (link is external)работает аналогично mysql_connect() (link is external) с двумя важными отличиями.
Во-первых, при соединении функция пытается найти уже открытый (постоянный) указатель на тот же сервер с тем же
пользователем и паролем. Если он найден, возвращён функцией будет именно он, вместо открытия нового соединения.
Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется
рабочим для будущего использования ( mysql_close() также не закрывает постоянные соединения, открытые
mysql_pconnect()).
Абстарктный тип данных, который определяет контракты по которым обязуются реализовать методы в классах, которые
их имплементируют.
На практике интерфейсы содержат определения функций (то есть описание их сигнатур) без их реализации.
Интерфейс — это контракт, который должен быть реализован конкретным классом. Абстрактный класс похож на обычный,
но отличается тем, что может содержать абстрактные методы — методы без реализации, и нельзя создать экземпляр
абстрактного класса. Так же интерфейсы имплементируются, а от абстрактных классов наследуются.
Магические методы - это специальные методы, которые переопределяют действие PHP по умолчанию, когда над
объектом выполняются определённые действия.
construct(), destruct(), call(), callStatic(), get(), set(), isset(), unset(), sleep(), wakeup(), serialize(), unserialize(), toString(),
invoke(), set_state(), clone() и __debugInfo()
Генераторы предоставляют лёгкий способ реализации простых итераторов без использования дополнительных ресурсов
или сложностей, связанных с реализацией класса, реализующего интерфейс Iterator.
}
} else {
if ($step >= 0) {
throw new LogicException('Шаг должен быть отрицательным');
}
for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}
В самом простом варианте оператор "yield" можно рассматривать как оператор "return", за исключением того, что вместо
прекращения работы функции, "yield" только приостанавливает её выполнение и возвращает текущее значение, и при
следующем вызове функции она возобновит выполнение с места, на котором прервалась.
Трейт - это механизм обеспечения повторного использования кода в языках с поддержкой только одиночного
наследования, таких как PHP. Трейт предназначен для уменьшения некоторых ограничений одиночного наследования,
позволяя разработчику повторно использовать наборы методов свободно, в нескольких независимых классах и
реализованных с использованием разных архитектур построения классов.
trait Magic
{
// Доступно только внутри трейта
private $properties;
class Config
{
// Включение трейта в класс
use Magic;
}
18. Опишите поведение при использовании traits с одинаковыми именами полей и / или методов.
При использовании нескольких трейтов с одинаковыми методами, возникает конфликт. Разрешение конфликта
производится с помощью оператора insteadOf . Так же если у дочернего класса есть такой же переопределенный метод
как и у базового, и стаким же именем есть у трейта, порядок вызова следующий:
class Base {
public function sayHello()
{
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello()
{
echo 'SayWorld!';
}
}
trait SayHello {
public function sayHello()
{
echo 'SayWorld!';
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayForTrait();
Да
Да
Исключение в PHP может быть выброшено (throw) и поймано (catch). Код может быть заключён в блок try, чтобы
облегчить обработку потенциальных исключений. У каждого блока try должен быть как минимум один соответствующий
блок catch или finally.
Исключения необходимо для информативного оповещения об ошибке приложения.
22. Что такое type hinting, как работает, зачем нужен?
Type Hinting — это механизм, который позволяет явно указывать типы параметров.
24. Сравнение значений переменных в РНР и подводные камни? Приведение типов. Что изменилось в
PHP 8 в этом контексте?
var_dump(empty($a));
var_dump(isset($a));
// Какое значение выведеться в консоли ?
declare(strict_types=1);
PHP8:
union types
Типы null и false можно использовать отдельно (возвращаемый тип)
Возвращаемый тип static
mixed
...
Сессии являются простым способом хранения информации для отдельных пользователей с уникальным идентификатором
сессии. Это может использоваться для сохранения состояния между запросами страниц. Идентификаторы сессий обычно
отправляются браузеру через сессионный cookie и используются для получения имеющихся данных сессии. Отсутствие
идентификатора сессии или сессионного cookie сообщает PHP о том, что необходимо создать новую сессию и
сгенерировать новый идентификатор сессии.
Создается файл в директории на сервере, который указан в конфигурации php
include - при отcутствии скрипта в подключенном файле не выдает ошибку, require - выдает. include_once, required_once -
подключает файл единожды.
Сложность алгоритма - это количественная характеристика, которая говорит о том, сколько времени, либо какой объём
памяти потребуется для выполнения алгоритма. О(n) - обозначается как О большое.
Замыкания в PHP представляют анонимную функцию, которая может использовать переменные из своего локального
окружения. В отличие от обычных анонимных функций замыкания в PHP могут применять выражение use.
$a = 8;
$b = 10;
$result = $closure(22); // 40
echo $result;
В 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();
}
class B extends A {
public static function who() {
print(__CLASS__) . PHP_EOL;
}
}
B::test();
B::testStatic();
// A
// B
Может использоваться в проектировании паттернов в контексте наследования.
Стандартная библиотека PHP (SPL) - это набор интерфейсов и классов, предназначенных для решения стандартных задач.
SPL предоставляет ряд стандартных структур данных, итераторов для оббегания объектов, интерфейсов, стандартных
исключений, некоторое количество классов для работы с файлами и предоставляет ряд функций, например
spl_autoload_register().
Проще говоря, это сервисные классы php, которые предоставляют стандартизированные объекты для работы со
структурами данных. Так же описывают стндарт загрузки библиотек. Что позволяет пользоваться сторонними
модулями(библиотеками).
Note
Здесь лучше всего описать своимим словами, так как понимаете именно вы. Еще желательно опыт применения. В
каких случаях уместно.
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';
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()
);
}
}
Model View Controller - архитектурный паттерн, который разделяет логику от модели и представления.
Паттерны "Банды 4" которые решают самые частые и повторяющийся проблемы проектирования архитектуры. Они есть
трех видов:
- Порождающие
- Структурные
- Поведенческие
class Singleton
{
private static $instance = null;
/**
* @return Singleton
*/
public static function getInstance()
{
if (self::$instance === null)
{
self::$instance = new self();
}
return self::$instance;
}
private function __clone() {}
Docker — это платформа, которая позволяет упаковать в контейнер приложение со всем окружением и зависимостями, а
затем доставить и запустить его в целевой системе. Приложение, упакованное в контейнер, изолируется от операционной
системы и других приложений.
SSH (от англ. secure shell ― безопасная оболочка) ― это защищённый сетевой протокол для удалённого управления
сервером через интернет.
Сетевой протокол прикладного уровня, предназначеный для безопасного удаленного доступа к UNIX-системам. Данный
протокол эффективен тем, что шифрует всю передаваемую информацию по сети.
PDO (PHP Data Objects) — расширение PHP, которое реализует взаимодействие с базами данных при помощи объектов.
Профит в том, что отсутствует привязка к конкретной системе управления базами данных
JIT компилятор
Аннотации/Атрибуты (Attributes)
Именованные параметры (Named Arguments)
Оператор выбора match (Match expression v2)
Адекватное приведение строки в число (Saner string to number comparisons)
Constructor Property Promotion
Объединения типов (Union Types 2.0)
Строки с двойными и одинарными кавычками отличаются тем: Подстановкой переменных: в строку с двойными
кавычками значение переменной подставляется, а в строчку с одинарными нет
Небольшой фрагмент данных, отправленный веб-сервером и хранимый на компьютере пользователя. Веб-клиент (обычно
веб-браузер) всякий раз при попытке открыть страницу соответствующего сайта пересылает этот фрагмент данных веб-
серверу в составе HTTP-запроса.
Конфеденциальные данные. Нельзя, потому что есть риск получить файл cookie злоумышленником.
Git
50. Какой командой добавить изменения?
git add .
git commit -m
52. Какой командой отправить изменения в удаленный репозиторий?
git pull
Как git merge, так и git rebase интегрируют изменения из одной ветки в другую ветку. Git rebase применяет все изменения
ветки функций поверх основной ветки, создавая новую фиксацию для каждой из ее предыдущие сообщения фиксации.
Команда rebase изменяет историю коммитов и снова создает коммиты поверх главной ветки.
Базы данных
55. Что такое транзакция?
Транзакция представляет собой последовательность операторов языка SQL, которая рассматривается как некоторое
неделимое действие над базой данных
Нормализация — это процесс организации данных в базе данных, включающий создание таблиц и установление
отношений между ними в соответствии с правилами, которые обеспечивают защиту данных и делают базу данных более
гибкой, устраняя избыточность и несогласованные зависимости
Связь "один-ко-многим" Рассмотрим базу данных, в которой учитываются заказы, включающую таблицы "Клиенты" и
"Заказы" в качестве примера. ...
Связь "многие-ко-многим" Рассмотрим связь между таблицами "Товары" и "Заказы".
Связь "один-к-одному"
60. Что означает утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей?
Задача поддержки, или обеспечения ссылочной целостности заключается в том, чтобы предотвращать или устранять
нарушение корректности значений внешних ключей при внесении изменений в базу данных путём коррекции значений
внешних ключей, если это возможно, или отмены операции редактирования, если такая коррекция невозможна.
Первичный ключ: набор определенных признаков, уникальных для каждой записи. Обозначается первичный ключ, как
primary key.
Внешний ключ (Foreign key, кратко FK). Обеспечивает однозначную логическую связь, между таблицами одной БД.
Первичный ключ используется для уникальной идентификации записей в таблице, а внешний ключ используется для
соединения двух таблиц вместе.
Связь "один к одному" (one-to-one) означает, что каждый элемент в одной группе (таблице) соответствует только одному
элементу в другой группе. Например, в отношении между мужем и женой каждый муж имеет только одну жену, и каждая
жена имеет только одного мужа.
Связь "один ко многим" (one-to-many) означает, что каждый элемент в одной группе (таблице) может соответствовать
нескольким элементам в другой группе (таблице), но каждый элемент в другой группе (таблице) соответствует только
одному элементу в первой группе (таблице). Примером может служить отношение между родителями и детьми: каждый
родитель может иметь несколько детей, но каждый ребенок имеет только двух родителей.
Связь "многие ко многим" (many-to-many) означает, что каждый элемент в одной группе (таблице) может соответствовать
нескольким элементам в другой группе (таблице), и каждый элемент в другой группе (таблице) может соответствовать
нескольким элементам в первой группе (таблице). Примером может быть отношение между учениками и предметами в
школе: каждый ученик может изучать несколько предметов, и каждый предмет может быть изучаем несколькими
учениками.
Эти связи широко используются при проектировании баз данных, моделировании отношений между объектами и в других
аспектах системного проектирования.
Группировка данных позволяет объединить одинаковые значения в заданных полях в группы, а затем выполнять подсчеты
для каждой группы.
Главное отличие HAVING от WHERE в том, что в HAVING можно наложить условия на результаты группировки, потому что
порядок исполнения запроса устроен таким образом, что на этапе, когда выполняется WHERE, ещё нет групп, а HAVING
выполняется уже после формирования групп.
Операторы UNION, INTERSECT и EXCEPT используются для объединения, пересечения и вычитания данных из двух или
более таблиц.
Datetime представляет из себя дату, как в календаре и время, которое мы видим на часах, в нашей временной зоне.
Timestamp же представляет из себя время, точно определённое для всех, ведь в мире много временных зон.
Пример:
Как много прошло времени начиная с 2013-01-10 14:45:32? Зависит от того, в какой временной зоне вы находитесь. Если
же спросить, сколько это 1492256793.49 секунд начиная с 1970-01-01 00:00:00 UTC — мы можем точно сказать,
сконвертировав timestamp в обычное время с учётом нашей временной зоны.
Типы данных DATETIME и TIMESTAMP используются для хранения даты и времени в базах данных, но есть некоторые
различия между ними.
Диапазон значений:
Хранение:
Автоматическое обновление:
Часовые пояса:
DATETIME: не учитывает часовые пояса. Значения DATETIME считаются локальными для сервера базы данных.
TIMESTAMP: может быть настроен для учета часовых поясов. Значения TIMESTAMP хранятся в формате UTC, но могут
быть преобразованы в местное время при выборке данных.
Выбор между типами данных DATETIME и TIMESTAMP зависит от конкретных требований вашего проекта. DATETIME
предпочтительнее, если вам необходимо хранить даты в широком диапазоне значений и не требуется автоматическое
обновление. TIMESTAMP может быть полезен, если вам нужно автоматическое обновление или поддержка часовых
поясов, но он ограничен диапазоном значений.
MyISAM: Движок по умолчанию. Не поддерживает транзакций, средняя надежность хранения данных. Превосходная
производительность чтения данных для интенсивных приложений. Большинство веб сервисов и хранилищ данных активно
используют MyISAM.
InnoDB: Транзакционный тип движка, применяемый при интенсивных операциях записи, спасибо возможности блокировки
уровня строк таблицы. Великолепная восстанавливаемость и высокая надежность хранения данных. Движок InnoDB был
приобретен Oracle в 2005 году.
Существует множество способов оптимизации производительности баз данных. Вот некоторые из них:
Индексирование: Создание индексов на часто используемых столбцах позволяет ускорить поиск и сортировку данных.
Нормализация базы данных: Структурируйте данные таким образом, чтобы уменьшить дублирование и избежать
аномалий при обновлении. Хорошая нормализация помогает ускорить выполнение запросов и обеспечить целостность
данных.
Кэширование: Используйте кэширование для временного хранения часто запрашиваемых данных, чтобы избежать
излишних обращений к базе данных. Это может быть реализовано с помощью инструментов кэширования на уровне
приложения или с помощью кэшей на уровне базы данных, таких как Redis или Memcached.
Партиционирование: Разделение больших таблиц на небольшие физические разделы (партиции) может улучшить
производительность запросов и упростить управление данными.
Оптимизация структуры таблиц: Избегайте хранения больших объемов данных в одной таблице. Разделите таблицы на
более мелкие, чтобы ускорить запросы и облегчить администрирование.
Настройка сервера базы данных: Изучите и настройте параметры конфигурации сервера базы данных, такие как размер
буферного пула, количество одновременных подключений и другие параметры, чтобы достичь наилучшей
производительности в зависимости от вашего конкретного сценария использования.
Предварительное вычисление и агрегирование: Если у вас есть сложные запросы, которые требуют вычислений или
агрегации большого объема данных, рассмотрите возможность предварительного вычисления и кэширования
результатов, чтобы ускорить выполнение запросов.
Масштабирование: Если ваша база данных продолжает расти и нагрузка на нее увеличивается, рассмотрите возможность
горизонтального или вертикального масштабирования, чтобы улучшить производительность. Горизонтальное
масштабирование включает распределение данных по нескольким серверам, а вертикальное масштабирование -
увеличение ресурсов сервера базы данных.
MongoDB
Индекс представляет из себя структуру, в которой хранятся значения одного или нескольких столбца таблицы и ссылок на
строки, где эти значения расположены. Для хранения индексов чаще всего используются "бинарные деревья".
79. Что такое хранимые процедуры, функции и триггеры в MySQL? Для чего они?
Хранимые процедуры представляют собой набор команд SQL, которые могут компилироваться и храниться на сервере.
Таким образом, вместо того, чтобы хранить часто используемый запрос, клиенты могут ссылаться на соответствующую
хранимую процедуру. Это обеспечивает лучшую производительность, поскольку данный запрос должен анализироваться
только однажды и уменьшается трафик между сервером и клиентом. Концептуальный уровень можно также повысить за
счет создания на сервере библиотеки функций.
Триггер представляет собой хранимую процедуру, которая активизируется при наступлении определенного события.
Например, можно задать хранимую процедуру, которая срабатывает каждый раз при удалении записи из транзакционной
таблицы - таким образом, обеспечивается автоматическое удаление соответствующего заказчика из таблицы заказчиков,
когда все его транзакции удаляются.
Функции - это примерно тоже самое, что и процедуры, за исключением того, что в функции мы всегда делаем return.
Организация сохранности вложенных категорий в MySQL может быть достигнута с использованием двух основных
подходов: "Материализованный путь" (Materialized Path) и "Список смежности" (Nested Set).
Оба подхода имеют свои преимущества и недостатки, поэтому выбор зависит от конкретных требований вашего проекта.
Выбор правильного метода и его реализация должны учитывать ожидаемый объем данных, типы операций чтения и
записи, а также частоту изменения иерархии категорий.
Laravel
81. Какие есть связи и как они реализуются в Laravel?
https://laravel.com/docs/10.x/eloquent-relationships
82. Что такое полиморфные связи, как они работают?
Полиморфные связи — это динамические связи между таблицами с использованием типа сущности.
83. Что такое middleware? Зачем это? На каком этапе выполняется?
Удобный механизм для фильтрации HTTP-запросов вашего приложения. Выполняется на этапе между роутами и
контроллерами.
Composer
84. Что такое Composer?
Composer — это популярный менеджер зависимостей PHP, который упрощает процесс установки и обновления
зависимостей проекта.
Require содержит все, что нужно вашему проекту для запуска в проде, тогда как require-dev определяет дополнительные
требования для разработки.
Практические задания
86. Спроектируйте базу данных для хранения информации о книгах и их авторах. Напишите запрос для
выборки всех авторов и количества написанных ими книг.
Для хранения информации о книгах и авторах в базе данных можно создать две таблицы: "Authors" (Авторы) и "Books"
(Книги).
Для выборки всех авторов и количества написанных ими книг можно использовать следующий SQL-запрос:
Этот запрос объединяет таблицы "authors" и "books" по идентификатору автора. Затем он группирует результаты по имени
автора и подсчитывает количество книг, написанных каждым автором. Результатом будет список авторов и
соответствующее количество их книг.
87. Есть матрица 3×3. Посчитайте сумму диагоналей.
return $val;
}
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
var_dump(sumDiagonalMatrix($matrix));
88. Ваш приложение выдает 500 ошибку. Опишите последовательность поиска проблемы.
if (-1) {
print "True";
} else {
print "False";
}
$a = 3; $b = 2;
echo (int) $a / (int) $b;
Middle
Общие вопросы
1. Как передаются переменные (по значению или по ссылке)?
По значению
Браузер посылает HTTP запрос к серверу, запрашивая его отправить копию сайта для клиента. Это сообщение и все
остальные данные, передаваемые между клиентом и сервером, передаются по интернет-соединению с использованием
протокола TCP/IP.
Splat оператор в определении функции он выполняет "упаковку" параметров, а при вызове - наоборот, "распаковку".
Вариативная функция с изменяющимся числом аргументов.
someMethod(...$arguments);
PHP-инъекция
e-mail-инъекция
SQL-инъекция
// Проверка по белому списку. Допускаются только русские и латинские буквы, цифры и знаки _- <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/>
}
6. Что такое идемпотентные методы? Какие HTTP-методы являются идемпотентными для REST?
Метод HTTP является идемпотентным, если повторный идентичный запрос, сделанный один или несколько раз подряд,
имеет один и тот же эффект, не изменяющий состояние сервера. Другими словами, идемпотентный метод не должен
иметь никаких побочных эффектов (side-effects), кроме сбора статистики или подобных операций.
Методы GET, HEAD, OPTIONS и TRACE определены как безопасные, что также делает их идемпотентными.
"Отсутствие состояния"
Протокол передачи данных, который относит каждый запрос к независимой транзакции, которая не связана с
предыдущим запросом.
Mock-объект представляет собой конкретную фиктивную реализацию интерфейса, предназначенную исключительно для
тестирования взаимодействия и относительно которого высказывается утверждение.
class RemoteRepository
{
public function __construct(private \Psr\Http\Client\ClientInterface $httpClient)
{
}
<?php
$client = new \GuzzleHttp\Client();
$repository = new RemoteRepository($client);
$movies = $repository->getMovies('tt39105467134');
В формате key:value
15. Расскажите о целесообразности применения Redis / Memcached для кэширования. Каковы плюсы и
минусы?
OPcahce — это расширение для PHP, которое ускоряет работу за счёт кэширования опкодов.
JIT – это выполнение кода и его компиляция по принципу «just in time». Соответствующая операция подразумевает
компилирование кода не до выполнения программного обеспечения, а тогда, когда это необходимо.
PHP предоставляет ключевое слово final, разместив которое перед объявлениями методов или констант класса, можно
предотвратить их переопределение в дочерних классах. Если же сам класс определяется с этим ключевым словом, то он
не сможет быть унаследован.
Facade
Builder
Fabrica
Bridge
Abstract Fabrica
Шаблон проектирования, который инкапсулирует бизнес логику вашего приложения и определяет границу и набор
допустимых операций с точки зрения взаимодействующих с ним клиентов.
Стандартный жизненный цикл состоит из следующих пунктов: HTTP-запрос через Роуты (Routes) поступает в Контроллер
(Controller) Контроллер осуществляет некоторые действия в зависимости от запроса и передает данные в Отображения
(Views) Отображения отображают полученные данные заданным образом, обеспечивая HTTP-ответ.
Процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во
время выполнения
Функция, осуществляющая преобразование массива входных данных произвольной длины в выходную битовую строку
установленной длины, выполняемое определённым алгоритмом. Преобразование, производимое хеш-функцией,
называется хешированием.
Для фоновых задач. По сути очередь - это та же бд только после выполнения очереди запись о ней удаляется.
29. Как в общих чертах работает OPcache?
OPCache блокирует общую память во время записи. Общая память используется для: Кэширования структуры данных
скрипта, включая и кэширование опкодов. Создания буфера общего внутреннего хранилища строк.
Разработка через тестирование. Хорошая вещь, но на практике (к сожалению) почти никто ей не придерживается.
Тест интеграции отличается от модульного теста тем, что он позволяет двум или более программным компонентам
работать совместно, также называемый интеграцией.
Этот механизм работает так: если интерпретатор наталкивается на использование класса, то он проверяет, определили ли
вы автозагрузчик классов, и, если определили, то вызывает его (пример). Composer определяет такой загрузчик
автоматически. Его можно конфигурировать с помощью файла composer. json .
33. Расскажите о Unit Tests (required), Functional Tests (optional). Моки и стаб в PHP.
Senior
Общие вопросы
1. Как вы понимаете REST?
При чтении области данных используется общая копия, в случае изменения данных — создается новая копия.
3. Что такое позднее статическое связывание?
Связанность (coupling) и связность (cohesion) являются одними из основных характеристик качества проектируемой
системы (в частности программной системы).
Связанность модулей (coupling), часто называемую зацеплением, характеризует степень независимости модулей. При
проектировании систем необходимо стремиться, чтобы модули имели минимальную зависимость друг от друга, т.е. были
минимально «сцеплены» между собой (отсюда и термин «сцепление» или связанность). Это требование вытекает из
одного из основных принципов системного подхода, требующего минимизации информационных потоков между
подсистемами.
Связность (cohesion) характеризует целостность, «плотность» модуля, т.е. насколько модуль является простым с точки
зрения его использования. В идеале модуль должен выполнять одну единственную функцию и иметь минимальное число
«ручек управления». Примером модуля имеющего максимальную связность является модуль проверки орфографии. Если
связанность является характеристикой системы, то связность характеризует отдельно взятый модуль.
Связанность (coupling) и связность (cohesion) используются не только при проектировании программных комплексов, а
являются общесистемными характеристиками и применимы при синтезе любых систем.
7. Стоит ли возвращать null из методов? Если нет, то почему и как писать код в таких случаях?
Возвращая null, мы фактически создаем для себя лишнюю работу, а для вызывающей стороны — лишние проблемы. Стоит
пропустить всего одну проверку null, и приложение «уходит в штопор».
8. Какой подход следует применить во время тестирования кода, имеющего внешние зависимости
(например, обращение к API Google)?
Domain Driven Design - это подход, который нацелен на изучение предметной области предприятия в целом или каких-то
отдельных бизнес-процессов с последующим переводом в код.
Это подход, который помогает не только ускорить разработку продукта, но и сделать ее гибкой и управляемой: проект из
неделимого целого превращается в систему связанных между собой блоков — сервисов. Одним из главных принципов
явялется "независимость" и "изолированность" сервиса.
API
Брокеры сообщений
Фильтр Блума — это структура данных, цель которой — быстро проверить, что элемент НЕ входит в множество
Redis
Основной параметр, который характеризует систему кеширования – это процент попаданий запросов в кеш. Этот
параметр довольно легко измерить, чтобы понять насколько ваша система кеширования эффективна.
16. Приведите сложный пример кэширования на практике.
17. Коротко расскажите об истории PHP. Что появлялось в каждой версии? Куда развивается PHP на ваш
взгляд? Что нового в последней версии?
unset()
Singleton
20. Как сделать рефакторинг большого legacy-проекта? Как это аргументировать / продать PM-у,
заказчику?
21. По какому принципу будете выбирать архитектуру для своей будущей программы?
22. С какими видами архитектуры приложений сталкивались?
Монолит
Модульная
Сервисная
Микросервисная
Array
Stack
Queue
Cortege
....
Все по немногу