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

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

Открыть в Telegram
2 344
Подписчики
-124 часа
-17 дней
-1730 день
Архив постов
🤔 Что такое DI Container? Это инструмент для управления зависимостями приложения. • Он автоматически создаёт объекты и предоставляет их другим компонентам, решая, какие зависимости инъектировать. • Контейнер упрощает реализацию DI, улучшает модульность и тестируемость приложения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем заключается 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 + микросервисы). Высоконагруженные системы, где важна отказоустойчивость. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое подготовка запросов? Это запросы, которые компилируются сервером перед выполнением. 1. Они защищают от SQL-инъекций, так как параметры передаются отдельно от запроса. 2. Улучшают производительность, так как один запрос можно выполнить несколько раз с разными данными. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое полнотекстовый индекс? Это специализированный тип индекса, используемый для эффективного поиска текста в больших текстовых полях. Он позволяет быстро находить строки, содержащие определённые слова или фразы, в отличие от стандартных индексов, которые работают с точными совпадениями. 🚩Зачем нужен полнотекстовый индекс? Полнотекстовый индекс предназначен для поиска и обработки текстовой информации, особенно в больших текстовых данных. Это необходимо, когда требуется: Искать слова или фразы внутри длинных текстовых полей. Находить записи, которые соответствуют похожим по смыслу запросам, а не только точным совпадениям. Обеспечивать более быстрый и релевантный поиск по сравнению с простым перебором данных. 🚩Как работает полнотекстовый индекс? 🟠Индексация Когда создаётся полнотекстовый индекс, база данных анализирует текстовые данные, разбивает их на слова (токены) и сохраняет их в особой структуре индекса. 🟠Поиск При выполнении запроса база данных ищет совпадения среди токенов в индексе, а не в самом тексте. 🟠Релевантность Полнотекстовый индекс учитывает частоту появления слов и их позицию, чтобы выдавать результаты, наиболее соответствующие запросу. 🚩Использование полнотекстового индекса в MySQL 🟠Создание полнотекстового индекса Полнотекстовый индекс можно создавать для столбцов типа CHAR, VARCHAR, или TEXT.
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    FULLTEXT(title, content)
);
🟠Поиск с использованием полнотекстового индекса Для выполнения полнотекстового поиска используется оператор MATCH ... AGAINST.
SELECT * 
FROM articles
WHERE MATCH(title, content) AGAINST('PHP tutorial');
🟠Модели поиска Natural Language Mode: Поиск слов и фраз с учётом их важности. Boolean Mode: Позволяет использовать логические операторы (например, + для обязательных слов, - для исключаемых). Query Expansion: Автоматически расширяет запрос с помощью синонимов или связанных слов.
SELECT * 
FROM articles
WHERE MATCH(title, content) AGAINST('+PHP -Java' IN BOOLEAN MODE);
🚩Ограничения полнотекстового индекса 🟠Минимальная длина слова По умолчанию слова короче 3 символов игнорируются (это настраивается). 🟠Стоп-слова Некоторые часто встречающиеся слова (например, "and", "the") исключаются из индексации. 🟠Чувствительность к языку Важно учитывать настройки языка для анализа текста. 🟠Поддержка типов данных Полнотекстовые индексы доступны только для текстовых полей. 🚩Плюсы ➕Быстрый поиск по большим объемам текста. ➕Удобная работа с нерелевантными данными (например, похожими словами). ➕Возможность вычисления ранжирования (релевантности) результатов. Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Какие уровни изоляции ты знаешь? Уровни изоляции в системах управления базами данных (СУБД) определяют, как операции транзакций видят и взаимодействуют с изменениями, внесенными другими параллельно выполняющимися транзакциями. Эти уровни изоляции помогают контролировать различные виды аномалий, таких как грязное чтение, неповторяющееся чтение и фантомные чтения. В стандарте SQL существует четыре основных уровня изоляции: 🚩Read Uncommitted (чтение незафиксированных данных) Этот уровень изоляции позволяет транзакциям видеть изменения других транзакций, даже если эти изменения еще не зафиксированы. Наименее строгий уровень изоляции, с наибольшей вероятностью возникновения аномалий. Аномалии: Грязное чтение (Dirty Read): Транзакция может прочитать данные, которые были изменены другой транзакцией, но еще не зафиксированы.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
🚩Read Committed (чтение зафиксированных данных) Транзакция может видеть только те изменения, которые были зафиксированы другими транзакциями. Средний уровень изоляции, который предотвращает грязные чтения, но допускает другие аномалии. Аномалии: Неповторяющееся чтение (Non-repeatable Read): Транзакция может дважды прочитать одно и то же значение и получить разные результаты, если другая транзакция изменила данные и зафиксировала изменения между двумя чтениями.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
🚩Repeatable Read (повторяемое чтение) Транзакция гарантирует, что если она читает данные, они останутся неизменными до завершения транзакции. Более строгий уровень изоляции, который предотвращает грязные и неповторяющиеся чтения, но не предотвращает фантомные чтения. Аномалии: Фантомное чтение (Phantom Read): Транзакция может получить разные результаты при выполнении одного и того же запроса, если другая транзакция добавляет или удаляет строки, которые соответствуют условиям запроса.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
🚩Serializable (сериабельность) Самый строгий уровень изоляции, который эмулирует последовательное выполнение транзакций. Полностью предотвращает грязные чтения, неповторяющиеся чтения и фантомные чтения. Аномалии: Никаких аномалий. Все транзакции выполняются так, как если бы они были выполнены последовательно.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое namespaces Namespaces в PHP — это способ организации кода для предотвращения конфликтов имен между классами, функциями и константами. Использование пространства имен позволяет создать уникальные идентификаторы, чтобы избежать пересечений между именами в крупных проектах или при использовании сторонних библиотек. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про полиморфизм Полиморфизм — это одна из ключевых концепций ООП (объектно-ориентированного программирования), которая позволяет объектам разного типа использовать один и тот же интерфейс. Это значит, что один метод может работать с разными типами данных, но при этом давать корректный результат. 🚩Зачем нужен полиморфизм? 🟠Гибкость кода можно легко заменять одни классы другими, не меняя общий код. 🟠Упрощение поддержки код становится понятнее и легче для расширения. 🟠Сокращение дублирования один общий интерфейс может использоваться разными классами. 🚩Виды полиморфизма Полиморфизм через наследование (override, переопределение методов) Полиморфизм через интерфейсы (реализация одного интерфейса разными классами) 🚩Полиморфизм через наследование Допустим, у нас есть базовый класс Animal, у которого есть метод makeSound(). Разные животные будут издавать разные звуки, но все они будут использовать этот метод.
class Animal {
    public function makeSound() {
        return "Some sound";
    }
}

class Dog extends Animal {
    public function makeSound() {
        return "Woof!";
    }
}

class Cat extends Animal {
    public function makeSound() {
        return "Meow!";
    }
}

function printSound(Animal $animal) {
    echo $animal->makeSound() . PHP_EOL;
}

printSound(new Dog()); // Выведет "Woof!"
printSound(new Cat()); // Выведет "Meow!"
🚩Полиморфизм через интерфейсы Иногда классы не связаны через наследование, но должны поддерживать общий метод. Для этого используется интерфейс:
interface Shape {
    public function getArea(): float;
}

class Circle implements Shape {
    private $radius;
    
    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function getArea(): float {
        return pi() * $this->radius * $this->radius;
    }
}

class Rectangle implements Shape {
    private $width, $height;
    
    public function __construct($width, $height) {
        $this->width = $width;
        $this->height = $height;
    }

    public function getArea(): float {
        return $this->width * $this->height;
    }
}

function printArea(Shape $shape) {
    echo "Площадь: " . $shape->getArea() . PHP_EOL;
}

printArea(new Circle(5));       // Выведет площадь круга
printArea(new Rectangle(4, 6)); // Выведет площадь прямоугольника
Ставь 👍 и забирай 📚 Базу знаний

🤔 По какому принципу объединяются и разделяются методы в интерфейсах? Методы в интерфейсах группируются по роли или контракту, то есть: - Каждый интерфейс должен описывать конкретное поведение (например, Serializable, Renderable). - Принцип разделения интерфейса (Interface Segregation Principle, SOLID) — лучше несколько небольших интерфейсов, чем один громоздкий. - Интерфейс отражает намерение: что объект умеет делать, а не как он это делает. Это упрощает поддержку, повторное использование и тестирование кода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 По чему WHERE AVG считает в среднем? В SQL, когда мы используем AVG(), мы рассчитываем среднее значение по множеству строк. Но WHERE фильтрует отдельные строки, а не группы данных. Проблема
SELECT * FROM products WHERE AVG(price) > 100; -- ❌ Ошибка!
🚩Как правильно использовать `AVG()` в фильтрах? Использовать HAVING вместо WHERE (если есть GROUP BY)
SELECT category, AVG(price) as avg_price 
FROM products 
GROUP BY category 
HAVING AVG(price) > 100;
Использовать подзапрос (SUBQUERY) в WHERE
SELECT * FROM products 
WHERE price > (SELECT AVG(price) FROM products);
Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего нужен ELT? ELT (Extract, Load, Transform) – это процесс обработки данных, используемый в аналитике: - Extract (Извлечение) – загрузка данных из источников (БД, API). - Load (Загрузка) – сохранение данных в хранилище (например, в Data Warehouse). - Transform (Преобразование) – очистка, фильтрация, агрегация данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Чем отличаются функции 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 "Файл не найден";
}
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Имеет ли значение регистр заголовка? Значение регистра заголовков может варьироваться в зависимости от конкретного контекста или системы разметки, в которой используются заголовки. Рассмотрим несколько примеров, чтобы понять, как различные системы относятся к регистру заголовков. 🚩HTML Регистр заголовков не имеет значения. Теги HTML не чувствительны к регистру, поэтому <H1>Заголовок</H1> и <h1>Заголовок</h1> будут интерпретироваться одинаково.
<h1>Заголовок</h1>
<H1>Заголовок</H1>
🚩Markdown Регистр заголовков также не имеет значения для самой разметки, но обычно принято использовать заглавные буквы для первых букв слов в заголовках, чтобы улучшить читаемость.
# Заголовок
# заголовок
🚩LaTeX Регистр заголовков тоже не имеет значения с точки зрения разметки, но стандартной практикой является использование заглавных букв в начале каждого важного слова для улучшения читаемости.
\section{Заголовок}
\section{заголовок}
🚩Wiki-разметка (например, MediaWiki) Регистр заголовков не влияет на разметку, но для консистентности и лучшей читаемости заголовки часто оформляют с заглавными буквами
= Заголовок =
= заголовок =
🚩Языки программирования Как таковые не используются, но комментарии-заголовки могут быть оформлены по-разному. Регистр здесь также не имеет значения для компилятора или интерпретатора, но для людей, читающих код, использование заглавных букв может сделать заголовки более заметными
# ЗАГОЛОВОК УРОВНЯ 1
# заголовок уровня 1
Оба варианта являются допустимыми комментариями
// ЗАГОЛОВОК УРОВНЯ 1
// заголовок уровня 1
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Как спроектировать базу данных? Проектирование базы данных – это ключевой этап в создании любой системы, где хранятся данные. Если БД спроектирована плохо, это приведёт к медленной работе, избыточности данных и сложным обновлениям. 🟠Определение требований и структуры данных Сначала нужно понять, какие данные будут храниться и как они связаны. Какие объекты будут в системе? (например, пользователи, заказы, товары). Как они связаны друг с другом? (например, один пользователь может делать много заказов). Какие поля нужны в каждой таблице? (например, 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
);
Ставь 👍 и забирай 📚 Базу знаний

Профориентация для взрослых. Наконец-то! Чтобы точно понять, какая профессия в маркетинге вам подходит, пройдите бесплатный т
Профориентация для взрослых. Наконец-то! Чтобы точно понять, какая профессия в маркетинге вам подходит, пройдите бесплатный тест на профориентацию от MAED. Тест разработан командой практикующих маркетологов и методистов — с учетом актуальных требований рынка. Начать #реклама 16+ maed.ru О рекламодателе

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

🤔 Как типы связи реализуются в Larevel? В Laravel связи между моделями реализуются через Eloquent ORM. Eloquent предоставляет удобные методы для работы с отношениями (relations) между таблицами в базе данных. 🚩Один к одному (`One to One`) Каждая модель User имеет один Profile.
class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}
В модели Profile
class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
Теперь можно получить профиль пользователя так
$user = User::find(1);
$profile = $user->profile; // Получаем профиль пользователя
🟠Один ко многим (`One to Many`) Каждый Post может иметь много Comment. В модели Post
class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}
В модели Comment
class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}
Теперь можно получить все комментарии к посту:
$post = Post::find(1);
$comments = $post->comments; // Коллекция комментариев
🟠Многие ко многим (`Many to Many`) Каждый User может подписаться на несколько Role, и наоборот. В Laravel для связи многие ко многим нужна промежуточная таблица role_user (название должно быть singular_singular в алфавитном порядке). В модели User
class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}
В модели Role
class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}
Теперь можно получить роли пользователя:
$user = User::find(1);
$roles = $user->roles;
Добавить роль:
$user->roles()->attach($roleId);
Удалить роль
$user->roles()->detach($roleId);
Синхронизировать (удалить старые и добавить новые):
$user->roles()->sync([1, 2, 3]);
🟠Связь через другую таблицу (`Has One / Has Many Through`) Например, у нас есть Country, User, Post. Мы хотим получить все посты в стране.
class Country extends Model
{
    public function posts()
    {
        return $this->hasManyThrough(Post::class, User::class);
    }
}
Теперь можно получить все посты страны
$country = Country::find(1);
$posts = $country->posts;
🟠Полиморфные связи (`Polymorphic Relations`) Позволяет разным моделям использовать одну таблицу для хранения данных. Пример: у нас есть Post и Video, к которым могут быть Comment В модели Comment
class Comment extends Model
{
    public function commentable()
    {
        return $this->morphTo();
    }
}
В модели Post
class Post extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}
В модели Video
class Video extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}
Использование
$post = Post::find(1);
$post->comments()->create(['content' => 'Отличный пост!']);

$video = Video::find(1);
$video->comments()->create(['content' => 'Крутое видео!']);
Ставь 👍 и забирай 📚 Базу знаний

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