PHP | Вопросы собесов
رفتن به کانال در Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
نمایش بیشتر2 346
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-37 روز
-2430 روز
آرشیو پست ها
🤔 Какой принцип нарушает 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. Выбор зависит от задачи: рекурсия подходит для демонстрации, итерация — для практических целей.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Чем отличаются функции unset от unlink?
Функции
unset() и unlink() в PHP выполняют совершенно разные задачи, несмотря на похожие названия.
🟠`unset()` – удаление переменной
unset() удаляет переменную из области видимости, но не освобождает память сразу.
$a = "Привет, мир!";
unset($a);
echo $a; // Ошибка: переменная не существует
🟠`unlink()` – удаление файла
unlink() удаляет файл с диска.
$file = "example.txt";
if (file_exists($file)) {
unlink($file); // Удаляет файл
echo "Файл удалён";
} else {
echo "Файл не найден";
}
Ставь 👍 и забирай 📚 Базу знанийRixos Premium Tekirova
Откройте семейный рай в сердце природы Средиземноморья
Забронировать
#реклама
rixos.com
О рекламодателе
🤔 В чем заключается Enterprise Service Bus (ESB)?
Это интеграционная архитектура, которая связывает разные сервисы и системы, обеспечивая обмен данными между ними.
Ключевые аспекты:
- Централизованное управление обменом сообщениями.
- Упрощение интеграции систем с разными форматами данных.
- Гибкость – можно легко добавлять и удалять сервисы.
- Масштабируемость – упрощает распределение нагрузки между сервисами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое инкапсуляция?
Инкапсуляция — это один из основных принципов ООП. Она представляет собой механизм, позволяющий скрыть внутренние детали объекта и предоставлять доступ к данным и методам объекта только через определенные интерфейсы. Это помогает защитить данные от некорректного использования и обеспечивает контроль над изменением состояния объекта.
🚩Основные аспекты
🟠Сокрытие данных
Инкапсуляция позволяет скрыть внутреннее состояние объекта от внешнего мира. Данные объекта становятся доступными только через методы, предоставленные самим объектом.
🟠Контроль доступа
Внутренние данные и методы объекта могут быть объявлены как приватные (
private) или защищенные (protected), что предотвращает их прямой доступ из кода вне объекта. Публичные методы (public) используются для взаимодействия с объектом.
🟠Целостность данных
Поскольку доступ к данным осуществляется через методы, можно контролировать и проверять изменения состояния объекта, что помогает поддерживать его целостность и корректность.
class User {
// Приватные свойства
private $name;
private $email;
// Конструктор для инициализации свойств
public function __construct($name, $email) {
$this->setName($name);
$this->setEmail($email);
}
// Публичный метод для получения имени
public function getName() {
return $this->name;
}
// Публичный метод для установки имени
public function setName($name) {
if (!empty($name)) {
$this->name = $name;
} else {
throw new Exception("Name cannot be empty");
}
}
// Публичный метод для получения email
public function getEmail() {
return $this->email;
}
// Публичный метод для установки email
public function setEmail($email) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
} else {
throw new Exception("Invalid email address");
}
}
}
// Создание объекта пользователя
$user = new User("John Doe", "john.doe@example.com");
// Получение и изменение данных через публичные методы
echo $user->getName(); // John Doe
$user->setEmail("new.email@example.com");
echo $user->getEmail(); // new.email@example.com
// Прямой доступ к приватным свойствам вызовет ошибку
// $user->name = "Jane"; // Ошибка
Ставь 👍 и забирай 📚 Базу знаний🤔 Что такое анонимные функции?
Анонимные функции, также известные как замыкания, в PHP и других языках позволяют создавать функции без определенного имени. Эти функции можно использовать как значения переменных и передавать как аргументы другим функциям.?
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое ключи в БД?
Это специальные поля или комбинации полей, которые используются для идентификации записей и установления связей между таблицами. Ключи играют важную роль в обеспечении целостности и эффективности базы данных.
🚩Виды ключей
🟠Первичный ключ (Primary Key)
Это одно или несколько полей, которые однозначно идентифицируют каждую запись в таблице. Он должен быть уникальным и не содержать NULL-значений.
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(100),
age INT
);
🟠Внешний ключ (Foreign Key)
Это поле или набор полей в одной таблице, которое указывает на первичный ключ в другой таблице. Внешние ключи используются для установления и обеспечения целостности ссылок между таблицами.
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100)
);
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY,
student_id INT,
course_id INT,
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
🟠Кандидатный ключ (Candidate Key)
Это поле или комбинация полей, которое может служить уникальным идентификатором для записи в таблице. Таблица может иметь несколько кандидатных ключей, из которых один выбирается как первичный ключ.
CREATE TABLE users (
user_id INT,
email VARCHAR(100),
phone VARCHAR(20),
PRIMARY KEY (user_id),
UNIQUE (email),
UNIQUE (phone)
);
🟠Альтернативный ключ (Alternate Key)
Это любой кандидатный ключ, который не выбран в качестве первичного ключа. В примере выше email и phone являются альтернативными ключами, так как user_id выбран как первичный ключ.
🟠Составной ключ (Composite Key)
Это ключ, состоящий из двух или более полей, которые вместе уникально идентифицируют запись.
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
🟠Суррогатный ключ (Surrogate Key)
Это искусственно созданный ключ, который обычно представляет собой уникальный идентификатор, не имеющий смысла вне контекста базы данных.
CREATE TABLE employees (
employee_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(100)
);
Ставь 👍 и забирай 📚 Базу знаний
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
