uk
Feedback
PHP | Вопросы собесов

PHP | Вопросы собесов

Відкрити в Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

Показати більше
2 342
Підписники
-224 години
-67 днів
-2530 день
Архів дописів
🤔 В чем заключается обработка ошибок и исключений? Это механизм выявления и реагирования на непредвиденные ситуации в коде. - Ошибки (Errors) – критические сбои (OutOfMemoryError, StackOverflowError). - Исключения (Exceptions) – проблемы в логике (NullPointerException, IOException). Обрабатываются с помощью try-catch-finally, throw, throws, а также глобальных обработчиков (onError, fallback strategies). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🖼️ Стажировки и вакансии для PHP разработчиков. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Tel
🖼️ Стажировки и вакансии для PHP разработчиков. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_php 🤖 ML & DS 👩‍💻 DevOps 👨‍✈️ ИБ & OSINT 👣 Go 👩‍💻 Mobile 👩‍💻 C# 👩‍💻 Node.js 👩‍💻 Python 🔎 QA 👩‍💻 Java 👩‍💻 UX/UI 👩‍💻 Frontend 🖼️ PHP 📋 Analyst 💼 1C 🖥 SQL 👩‍💻 IT HR Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.

🤔 Что считается хорошо написанным Task`ом? Хорошо написанный Task (задача) должен быть понятным, конкретным и выполнимым. Если задача написана размыто, разработчик потратит больше времени на уточнение деталей, а не на саму работу. 🚩Основные принципы хорошего Task'а 🟠Чёткое и понятное название Плохо: Исправить баг (какой баг? где?) Хорошо: Исправить ошибку расчёта скидки при оформлении заказа 🟠Описание должно отвечать на 3 вопроса: Что нужно сделать? (конкретные действия) Зачем это нужно? (какая проблема решается) Как это проверить? (критерии выполнения) 🟠Минимум абстракции, максимум конкретики Плохо: Добавить авторизацию на сайт Хорошо: Добавить авторизацию через Google OAuth 2.0 для пользователей, чтобы они могли входить через Google-аккаунт 🟠Разбивать задачи на подзадачи (если задача сложная) Например, если задача "Реализовать корзину покупок", то лучше разбить её на: Добавление товаров в корзину Расчёт итоговой суммы Удаление товаров из корзины Оформление заказа 🟠Указывать требования (технические детали, ссылки, макеты, API, форматы данных) Если задача связана с API → указываем эндпоинты. Если UI → прикладываем макеты (Figma, Zeplin). Если есть примеры → добавляем скриншоты. 🟠Добавлять критерии выполнения (Definition of Done, DoD) Плохо: Сделать фильтр по цене Хорошо: Фильтр по цене должен работать в диапазоне от 0 до 100 000, быть интерактивным (ползунок), без перезагрузки страницы. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что делать, если у двух trait'ов один и тот же метод? 1. Если два trait содержат методы с одинаковыми именами, необходимо явно указать, какой метод использовать, с помощью use TraitName::methodName. 2. В сложных случаях можно переопределить метод в классе для явной реализации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое DRY и KISS? Они помогают писать чистый, понятный и эффективный код. 🟠DRY (Don't Repeat Yourself – Не повторяйся) Смысл: Избегайте дублирования кода, выносите повторяющуюся логику в функции, классы или модули. Улучшает читаемость кода. Упрощает поддержку: изменили код в одном месте – обновилось везде. Исключает ошибки при дублировании кода. Плохо (нарушение DRY)
// Дублирование кода для расчёта скидки
$price1 = 100;
$discount1 = $price1 * 0.1;

$price2 = 200;
$discount2 = $price2 * 0.1;

$price3 = 300;
$discount3 = $price3 * 0.1;
Хорошо (принцип DRY)
function calculateDiscount($price) {
    return $price * 0.1;
}

$discount1 = calculateDiscount(100);
$discount2 = calculateDiscount(200);
$discount3 = calculateDiscount(300);
🟠KISS (Keep It Simple, Stupid – Делай проще) Смысл: Не усложняйте код, он должен быть простым и понятным. Код легче понимать и исправлять. Простота = меньше ошибок. Улучшает производительность (сложные конструкции могут замедлять код). Плохо (нарушение KISS)
function isEven($num) {
    if ($num % 2 == 0) {
        return true;
    } else {
        return false;
    }
}
Хорошо (KISS)
function isEven($num) {
    return $num % 2 == 0;
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Где можно столкнуться с динамической типизацией? Динамическая типизация характерна для языков, таких как Python, JavaScript, PHP. Например, переменная может быть сначала числом, а затем строкой. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какой принцип нарушает Active Record? Это популярный шаблон проектирования, который используется для взаимодействия с базой данных. Он сочетает в себе логику бизнес-модели и работу с базой данных в одном объекте. Несмотря на свою популярность и удобство, Active Record нарушает принцип разделения ответственности (Single Responsibility Principle, SRP) из SOLID. 🚩Почему Active Record нарушает SRP? SRP гласит, что класс должен иметь только одну причину для изменения, то есть заниматься только одной задачей. 🟠Логика бизнес-модели Класс хранит правила и поведение, связанные с сущностью (например, вычисления, валидации, связи). 🟠Работа с базой данных Класс отвечает за взаимодействие с базой данных, включая CRUD-операции (создание, чтение, обновление, удаление), построение SQL-запросов и т. д. Таким образом, Active Record совмещает две разные ответственности: бизнес-логику и взаимодействие с базой данных. Если изменится структура базы данных или логика обработки данных, класс придется менять, что нарушает SRP.
class User extends ActiveRecord {
    public function getFullName() {
        return $this->first_name . ' ' . $this->last_name;
    }

    public function saveUser() {
        $this->save(); // Метод сохранения в базе данных
    }
}
🚩Альтернатива Чтобы соблюсти SRP, можно разделить бизнес-логику и работу с базой данных на разные уровни: 🟠Data Mapper Отвечает только за преобразование данных между объектами и базой данных. 🟠Сервисы Обрабатывают бизнес-логику.
class User {
    private $firstName;
    private $lastName;

    public function __construct($firstName, $lastName) {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }

    public function getFullName() {
        return $this->firstName . ' ' . $this->lastName;
    }
}

class UserMapper {
    public function save(User $user) {
        // SQL-запрос для сохранения данных
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего предназначены форматы запросов и ответов приложения? Форматы запросов и ответов обеспечивают обмен данными между клиентом и сервером. Популярные форматы: - JSON – компактный, удобный для API. - XML – читаемый, часто используется в SOAP. - YAML – удобен для конфигураций. - Protobuf – бинарный, эффективный для высоконагруженных систем. Форматы обеспечивают унифицированное взаимодействие между различными сервисами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как спроектировать базу данных? Проектирование базы данных – это ключевой этап в создании любой системы, где хранятся данные. Если БД спроектирована плохо, это приведёт к медленной работе, избыточности данных и сложным обновлениям. 🟠Определение требований и структуры данных Сначала нужно понять, какие данные будут храниться и как они связаны. Какие объекты будут в системе? (например, пользователи, заказы, товары). Как они связаны друг с другом? (например, один пользователь может делать много заказов). Какие поля нужны в каждой таблице? (например, email, password, created_at). - Какие запросы будут выполняться чаще всего? Пример: интернет-магазин Пользователи (users) Товары (products) Заказы (orders) Связь между заказами и товарами (order_items) 🟠Определение таблиц и связей (ERD – диаграмма) Разделяем данные по таблицам и определяем связи (1-к-1, 1-к-N, N-к-N). Связи между таблицами: 1-к-1 → один профиль = один пользователь (users → user_profiles). 1-к-N → один пользователь = много заказов (users → orders). N-к-N → один заказ = много товаров, и один товар может быть в разных заказах (orders ↔️ products).
Users (id) --- (1:N) --- Orders (id, user_id) --- (N:M) --- Order_Items (order_id, product_id, quantity)
Products (id)
SQL-создание таблиц
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(255) UNIQUE,
    password VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255),
    price DECIMAL(10,2),
    stock INT
);

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id),
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);
Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем полезно пространство имен? Оно помогает организовывать код, делает его более читаемым и управляемым. Также снижает вероятность конфликта имен при работе с библиотеками или крупными проектами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Структуры данных в программировании какие знаешь? Структуры данных — это способы хранения и организации данных в памяти компьютера. Они помогают эффективно управлять данными и выбирать оптимальные алгоритмы. 🚩Основные структуры данных 🟠Массив (Array) Упорядоченная коллекция элементов, доступ к которым осуществляется по индексу. Когда нужно быстро получать элементы по индексу. Доступ: O(1) Поиск: O(n) Вставка/Удаление: O(n) (из-за необходимости сдвига элементов)
$numbers = [10, 20, 30, 40]; 
echo $numbers[2]; // 30
🟠Связанный список (Linked List) Элементы (узлы) хранят ссылку на следующий (а иногда и на предыдущий) элемент. Когда часто вставляете/удаляете элементы (без затрат на сдвиг). Доступ: O(n) Вставка/Удаление: O(1) (если известен указатель)
class Node {
    public int $data;
    public ?Node $next;

    public function __construct(int $data) {
        $this->data = $data;
        $this->next = null;
    }
}
🟠Стек (Stack) Структура LIFO (Last In, First Out). Элементы добавляются и удаляются только с одного конца. Для обратного прохода, отмены операций, рекурсии. Вставка/Удаление: O(1) Доступ: O(n)
$stack = new SplStack();
$stack->push(1);
$stack->push(2);
echo $stack->pop(); // 2 (удаляется последний добавленный)
🟠Очередь (Queue) Структура FIFO (First In, First Out). Первым зашёл – первым вышел. Когда элементы должны обрабатываться по порядку (например, задачи в принтере). Вставка/Удаление: O(1)
$queue = new SplQueue();
$queue->enqueue(1);
$queue->enqueue(2);
echo $queue->dequeue(); // 1 (удаляется первый добавленный)
🟠Хэш-таблица (Hash Table) / Ассоциативный массив Хранит пары ключ → значение, обеспечивает быстрый доступ по ключу. Когда нужен быстрый поиск и хранение пар ключ-значение. Доступ/Поиск: O(1)
$hashTable = [
    "name" => "Alice",
    "age" => 25
];

echo $hashTable["name"]; // Alice
🟠Дерево (Tree) Иерархическая структура, где каждый узел может иметь несколько дочерних. Когда важны иерархии (например, файловые системы, база данных). Виды Двоичное дерево (Binary Tree) – у каждого узла до 2 детей. Двоичное дерево поиска (BST) – левый потомок меньше, правый больше. B-дерево – используется в базах данных. Trie (Префиксное дерево) – для хранения строк, часто в поисковых движках.
class TreeNode {
    public int $value;
    public ?TreeNode $left = null;
    public ?TreeNode $right = null;

    public function __construct(int $value) {
        $this->value = $value;
    }
}
🟠Граф (Graph) Набор вершин (узлов) и рёбер (связей между узлами). Для моделирования сетей, карт, социальных графов. Типы графов Ориентированный (направленный) / Неориентированный Взвешенный / Невзвешенный Ациклический (DAG)
$graph = [
    "A" => ["B", "C"],
    "B" => ["A", "D", "E"],
    "C" => ["A", "F"],
    "D" => ["B"],
    "E" => ["B", "F"],
    "F" => ["C", "E"]
];
Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем HTTP первой версии отличается от второй? HTTP/1.1 требует для каждого запроса нового соединения, что создает дополнительную нагрузку. HTTP/2 поддерживает мультиплексирование, позволяя передавать несколько запросов и ответов одновременно по одному соединению, что улучшает производительность.? Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое ссылочная целостность связей? Ссылочная целостность (Referential Integrity) – это правило, которое гарантирует, что связи между таблицами остаются корректными. 🚩Пример в базе данных Допустим, у нас есть 2 таблицы: users (Пользователи) orders (Заказы) Связь: каждый заказ (orders) должен ссылаться на существующего пользователя (users) через user_id.
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10,2),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
🚩Как работает ссылочная целостность? Запрещает вставку "несуществующих" ссылок
INSERT INTO orders (id, user_id, amount) VALUES (1, 999, 100.00);
-- ❌ Ошибка! Пользователя с id = 999 нет в users
Запрещает удаление родительской записи, если есть зависимые
DELETE FROM users WHERE id = 1;
-- ❌ Ошибка! Есть заказы, которые ссылаются на пользователя id = 1
Автоматическое удаление связанных данных (ON DELETE CASCADE)
DELETE FROM users WHERE id = 1;
-- ✅ Все заказы с user_id = 1 тоже удалятся
🚩Способы управления ссылочной целостностью ON DELETE CASCADE → при удалении пользователя удаляются все его заказы. ON DELETE SET NULL → при удалении пользователя поле user_id в заказах становится NULL. ON DELETE RESTRICT → запрещает удалять пользователя, если у него есть заказы.
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем нужно ключевое слово final? Ключевое слово final в PHP используется для того, чтобы запретить наследование классов или переопределение методов в дочерних классах. Это помогает защитить важные части кода от изменения и сохранять логику в неприкосновенности. Final используется для обеспечения предсказуемости поведения в классах. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое strict mode? Strict mode (Строгий режим) в PHP — это режим, который заставляет PHP строго проверять типы аргументов в функциях. По умолчанию PHP автоматически преобразует типы (например, "10" превращается в 10), но в строгом режиме такая конвертация запрещена — если тип не совпадает, будет ошибка. 🚩Как включить strict mode? Строгий режим включается в начале PHP-файла с помощью:
declare(strict_types=1);
🚩Пример работы strict mode Без строгого режима (PHP сам меняет типы)
function sum(int $a, int $b) {
    return $a + $b;
}

echo sum("5", 10); // 15 (PHP сам превратит "5" в 5)
Со strict mode (жёсткая проверка типов)
declare(strict_types=1);

function sum(int $a, int $b) {
    return $a + $b;
}

echo sum("5", 10); // ❌ ФАТАЛЬНАЯ ОШИБКА!
🚩Зачем нужен strict mode? Позволяет избежать ошибок, связанных с автоматическим преобразованием типов. Делает код более предсказуемым и надёжным. Используется в крупных проектах, где важна строгая типизация. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое вертикальное шардирование? Вертикальное шардирование разделяет данные по столбцам (таблицам), при этом каждая часть данных хранится на отдельном сервере. Это полезно для разделения по функциональности, например, когда разные сервисы работают с разными наборами данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем заключается Enterprise Service Bus? Enterprise Service Bus (ESB) – это промежуточное программное обеспечение (middleware), которое объединяет разные системы и управляет их взаимодействием. 🚩Зачем нужен ESB? (Проблема без него) Допустим, у нас есть 4 системы: CRM (Клиенты) ERP (Бухгалтерия) Склад Интернет-магазин Без ESB каждая система должна напрямую связываться со всеми остальными
CRM ↔️ ERP
CRM ↔️ Склад
CRM ↔️ Интернет-магазин
ERP ↔️ Склад
ERP ↔️ Интернет-магазин
Склад ↔️ Интернет-магазин
🚩Как ESB решает проблему? ESB действует как единый центр интеграции
CRM → ESB → ERP
Склад → ESB → Интернет-магазин
ERP → ESB → CRM
🚩Как работает ESB? (Принцип) ESB использует 4 ключевых компонента Маршрутизация (Routing) – определяет, куда отправлять данные. Трансформация данных (Transformation) – конвертирует данные (например, из XML в JSON). Безопасность (Security) – контролирует доступ. Очереди сообщений (Message Queue) – управляет очередями и асинхронными задачами. CRM отправляет заказ в формате JSON → ESB принимает его. ESB конвертирует JSON в XML, понятный ERP. ESB отправляет данные в ERP и склад. Если склад временно недоступен, ESB ставит запрос в очередь и отправляет позже. 🚩Где используется ESB? Крупные компании с множеством сервисов (банки, ритейл, логистика). Интеграция старых и новых систем (например, SAP + микросервисы). Высоконагруженные системы, где важна отказоустойчивость. Ставь 👍 и забирай 📚 Базу знаний

🤔 В каких случаях используют индексы? Индексы в базах данных используются для ускорения операций поиска и сортировки данных. Они создаются на столбцах, по которым часто выполняются запросы, такие как `SELECT`, `WHERE` или `ORDER BY`. Индексы позволяют базе данных быстро находить нужные записи без необходимости сканировать всю таблицу. Однако индексы занимают дополнительное место и могут замедлять операции вставки и обновления данных, поэтому их следует использовать с осторожностью. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем отличие адаптера от декоратора? Это структурные паттерны проектирования, которые используются в объектно-ориентированном программировании для решения различных задач по структурированию классов и объектов. Несмотря на то, что оба паттерна оборачивают другие объекты, их цели и способы применения различаются. 🚩Адаптер (Adapter) Преобразовать интерфейс одного класса в интерфейс другого класса, который ожидают клиенты. Адаптер позволяет классам с несовместимыми интерфейсами работать вместе. Адаптер реализует интерфейс, который должен быть представлен клиенту, и перенаправляет вызовы клиента к объекту с другим интерфейсом. Важно, что адаптер изменяет интерфейс взаимодействия, но не добавляет новую функциональность. Вы разрабатываете приложение, которое должно использовать существующую библиотеку классов, интерфейсы которой не совместимы с остальной частью вашего приложения. Создав адаптер для этих классов, вы можете интегрировать библиотеку без изменения её кода или кода приложения. 🚩Декоратор (Decorator) Динамически добавить новую функциональность объекту. В отличие от наследования, декораторы предоставляют гибкий способ расширения функциональности объекта во время выполнения. Декоратор оборачивает исходный объект, предоставляя дополнительное поведение. Он имеет тот же базовый интерфейс, что и оборачиваемый объект, что позволяет использовать декораторы взаимозаменяемо с исходными объектами. Вы разрабатываете систему уведомлений и хотите добавить возможность логирования или шифрования сообщений. Создав декораторы для базового класса отправки сообщений, вы можете легко добавить новую функциональность, обернув базовый объект отправки в один или несколько декораторов. 🚩Отличия 🟠Цель применения Адаптер используется для обеспечения совместимости между различными интерфейсами, позволяя объектам с несовместимыми интерфейсами работать вместе. Декоратор добавляет новую функциональность объектам, не изменяя их интерфейсы. 🟠Изменение интерфейса Адаптер изменяет интерфейс объекта для совместимости с другим интерфейсом. Декоратор не изменяет интерфейс, но добавляет новое поведение, сохраняя при этом оригинальный интерфейс объекта. 🟠Добавление функциональности Декораторы предназначены для добавления новой функциональности объектам. Адаптеры не добавляют новую функциональность; их основная задача — обеспечить работу существующей функциональности через другой интерфейс. Ставь 👍 и забирай 📚 Базу знаний

🤔 Реализация Fibonacci с рекурсией или без? 1. С рекурсией: проще написать, но требует больше памяти из-за вложенных вызовов. 2. Без рекурсии: итеративный метод или использование динамического программирования, эффективнее с точки зрения производительности. 3. Выбор зависит от задачи: рекурсия подходит для демонстрации, итерация — для практических целей. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний