PHP | Вопросы собесов – Telegram
PHP | Вопросы собесов
2.44K subscribers
30 photos
1.06K links
Download Telegram
🤔 Что такое абстрактный класс?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое acid?

Это акроним, описывающий четыре ключевых свойства транзакций в системах управления базами данных (СУБД), обеспечивающие надежное выполнение транзакций даже в условиях ошибок, сбоев и множественного доступа. Эти свойства важны для обеспечения правильности и устойчивости данных. Он состоит из следующих компонентов:

🟠Атомарность (Atomicity)
Гарантирует, что все операции в рамках одной транзакции либо выполняются полностью, либо не выполняются вообще. Если какая-либо часть транзакции не может быть завершена, система откатит все уже выполненные операции, возвращая базу данных в состояние, которое существовало до начала транзакции. Это "всё или ничего".

🟠Согласованность (Consistency)
Означает, что каждая транзакция переводит базу данных из одного согласованного состояния в другое. Согласованность обеспечивает соблюдение всех правил и ограничений базы данных, таких как ключи, ограничения целостности и триггеры, после завершения транзакции.

🟠Изолированность (Isolation)
Определяет способ одновременного выполнения множества транзакций без оказания влияния друг на друга. Это свойство предотвращает проблемы, связанные с одновременным доступом, такие как "грязное чтение", "неповторяющееся чтение" и "фантомное чтение". СУБД обычно предлагают различные уровни изоляции, которые могут быть настроены в зависимости от нужд приложения.

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое traits?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Как сделать так, чтобы приложение разворачивалось быстрее в Dockerе?

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

🚩Оптимизация Dockerfile

🟠Меньше слоев
Каждая инструкция в Dockerfile создает новый слой в образе. Старайтесь минимизировать количество слоев, объединяя инструкции, где это возможно.
# Плохо
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y vim

# Хорошо
RUN apt-get update && \
apt-get install -y curl vim


🟠Использование правильного базового образа
Выберите наиболее подходящий базовый образ, который минимально необходим для вашего приложения. Использование минималистичных образов, таких как alpine, может существенно уменьшить размер образа.
FROM php:7.4-fpm-alpine


🟠Кэширование зависимостей
Сначала копируйте файлы с зависимостями (например, composer.json, package.json) и устанавливайте их, а затем копируйте остальной код. Это позволит Docker использовать кэш на этапе установки зависимостей, если они не изменились.
FROM php:7.4-fpm-alpine

# Установка зависимостей
COPY composer.json composer.lock /app/
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader

# Копирование кода
COPY . /app


🟠Использование многоступенчатой сборки
Многоступенчатая сборка позволяет собирать и тестировать ваше приложение в одном этапе и копировать только необходимые файлы в финальный образ, что уменьшает размер финального образа.
# Сборочный этап
FROM composer:latest AS builder
WORKDIR /app
COPY composer.json composer.lock /app/
RUN composer install --no-dev --optimize-autoloader

# Финальный этап
FROM php:7.4-fpm-alpine
WORKDIR /app
COPY --from=builder /app /app
COPY . /app


🟠Использование кэша сборки
При разработке используйте кэш Docker для ускорения сборки. Для этого нужно правильно организовать порядок инструкций в Dockerfile, чтобы неизменные части использовали кэш.

🟠Оптимизация Docker Compose
Если вы используете Docker Compose, убедитесь, что сервисы поднимаются параллельно и что вы используете возможность кэширования сборок.
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app_db
ports:
- "3306:3306"


🟠Использование кэшированных слоев и промежуточных образов
При частых изменениях кода старайтесь кэшировать слои, которые не меняются, и использовать промежуточные образы для ускорения сборки.
# Использование промежуточного образа
FROM php:7.4-fpm-alpine AS base
COPY . /app
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader

FROM base AS dev
RUN apk add --no-cache bash
CMD ["php-fpm"]

FROM base AS prod
CMD ["php-fpm"]


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

🟠Параллельная сборка и запуск
Используйте параллельную сборку и запуск контейнеров, если это возможно. Docker Compose поддерживает параллельный запуск, что может значительно ускорить процесс развертывания.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤔1
🤔 Разница между pull и fetch?

git pull выполняет fetch (загружает изменения из удалённого репозитория) и автоматически сливает их с локальной веткой. git fetch только загружает изменения, не изменяя локальные файлы, что позволяет вручную контролировать слияние.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое репликация?

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

🚩Зачем нужна репликация

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

🟠Улучшение производительности
Репликация позволяет распределить нагрузку на несколько серверов, что улучшает время отклика системы при больших объемах запросов.

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

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

🚩Виды репликации

🟠Синхронная репликация
Данные одновременно записываются на основной и реплицированный серверы. Высокая консистентность данных. Замедление операций записи, так как они должны быть подтверждены на всех репликах.

🟠Асинхронная репликация
Данные сначала записываются на основной сервер, а затем копируются на реплицированный сервер с задержкой. Быстрые операции записи на основной сервер. Возможность временной неконсистентности данных между серверами.

🟠Полная репликация
Все данные копируются на все реплицированные серверы. Простота реализации и высокая доступность данных. Высокие затраты на хранение и передачу данных.

🟠Частичная репликация
Только часть данных копируется на реплицированные серверы. Экономия ресурсов хранения и передачи данных. Более сложное управление данными.

🚩Пример использования

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

1⃣Настройка мастера
-- Включаем бинарные логи на мастере
[mysqld]
log-bin=mysql-bin
server-id=1


2⃣Создание пользователя для репликации на мастере
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';


3⃣Настройка слейва
-- Настройки слейва
[mysqld]
server-id=2


4⃣Запуск репликации на слейве
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='replica_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS= 107;
START SLAVE;


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔Что такое Service Locator?

Это паттерн проектирования, предоставляющий объект (локатор), который отвечает за предоставление зависимостей (сервисов) в приложении.
• Он хранит ссылки на зависимости и позволяет получить их по запросу.
• Недостаток: сложнее отслеживать зависимости и тестировать код, так как локатор создаёт скрытые связи.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое составной индекс?

Составной индекс (Composite Index) – это индекс, который создаётся сразу на несколько колонок таблицы.

🚩Как работает составной индекс?

🟠Пример без индекса (медленный поиск)
Допустим, у нас есть таблица orders
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
status VARCHAR(50),
created_at DATETIME
);


И мы выполняем поиск по user_id и status
SELECT * FROM orders WHERE user_id = 5 AND status = 'paid';


Создаём составной индекс (ускоряем поиск)
CREATE INDEX idx_user_status ON orders(user_id, status);


Как SQL использует составной индекс? (Правило слева направо)
Важный момент: составной индекс работает слева направо.
SELECT * FROM orders WHERE user_id = 5 AND status = 'paid'; --  Использует индекс
SELECT * FROM orders WHERE user_id = 5; -- Использует индекс (user_id - первый в индексе)


НЕ работает
SELECT * FROM orders WHERE status = 'paid'; --  Индекс не используется (user_id пропущен)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Для чего нужен middleware?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что знаешь про нормальные формы в БД?

Нормальные формы (Normal Forms, NF) в базах данных — это правила, которые помогают организовать данные так, чтобы избежать избыточности и аномалий при обновлении, удалении и вставке.

🚩Основные нормальные формы

🟠Первая нормальная форма (1NF)
убирает повторяющиеся группы и делает все столбцы атомарными.
Что нужно сделать?
Каждое поле должно содержать только одно значение.
В таблице нет повторяющихся строк.

🟠Вторая нормальная форма (2NF)
убирает зависимости от части составного ключа.
Что нужно сделать?
Данные, которые зависят не от всего первичного ключа, вынести в отдельные таблицы.
Должна быть уже в 1NF.

🟠Третья нормальная форма (3NF)
убирает транзитивные зависимости.
Что нужно сделать?
Данные должны зависеть только от первичного ключа и не зависеть от других неключевых полей.
Должна быть уже в 2NF.

🚩Дополнительные нормальные формы

🟠Бойса-Кодда (BCNF)
более строгая версия 3NF, исключает случаи, когда таблица имеет несколько потенциальных ключей, но один из них влияет на другой.
🟠Четвёртая нормальная форма (4NF)
убирает многозначные зависимости (например, если студент изучает несколько предметов, но предметы никак не связаны друг с другом).
🟠Пятая нормальная форма (5NF)
разбиение таблицы на подтаблицы для минимизации избыточности данных.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что запрещает final?

Модификатор final запрещает наследование класса, если он указан перед его объявлением.
Если final используется для метода, он запрещает переопределение этого метода в дочерних классах.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Слово "global" для чего используется?

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

🚩Как работает `global`?

Доступ к глобальной переменной внутри функции
$counter = 10; // Глобальная переменная

function increment() {
global $counter; // Доступ к глобальной переменной
$counter++;
}

increment();
echo $counter; // 11


Использование нескольких глобальных переменных
$a = 5;
$b = 10;

function sum() {
global $a, $b;
$b = $a + $b; // Меняем глобальную переменную $b
}

sum();
echo $b; // 15


🟠Альтернативный способ – `$GLOBALS`
Можно использовать суперглобальный массив $GLOBALS, который хранит все глобальные переменные.
$x = 3;
$y = 7;

function multiply() {
$GLOBALS['y'] = $GLOBALS['x'] * $GLOBALS['y'];
}

multiply();
echo $y; // 21


🚩Когда `global` – плохая идея?

Глобальные переменные усложняют отладку (их можно случайно изменить).
Функции становятся зависимыми от внешних данных (плохо для тестирования).
Лучше передавать переменные через аргументы функции.
Альтернативный способ (без global)
function increment($counter) {
return $counter + 1;
}

$counter = 10;
$counter = increment($counter);
echo $counter; // 11


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое инкапсуляция?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что такое транзакции?

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

🟠Atomicity (Атомарность)
Гарантирует, что все операции в рамках транзакции будут выполнены полностью или не будут выполнены вовсе. Если любая из операций внутри транзакции не удалась, все изменения откатываются.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;


🟠Consistency (Согласованность)
Обеспечивает перевод базы данных из одного согласованного состояния в другое. Транзакции должны оставлять базу данных в корректном состоянии, удовлетворяющем всем правилам и ограничениям.

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

🟠Durability (Долговечность)
Гарантирует, что изменения, внесённые успешно завершённой транзакцией, будут сохранены в базе данных даже в случае сбоя системы.

🚩Использования транзакций

🟠Перевод денег между счетами
Необходимо убедиться, что обе операции (списание и зачисление) выполнены успешно, чтобы избежать ситуации, когда деньги списаны, но не зачислены.
BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

COMMIT; -- Если обе операции прошли успешно
-- ROLLBACK; -- Если произошла ошибка


🟠Создание заказа в интернет-магазине
Важно убедиться, что все связанные операции (добавление записи о заказе, обновление статуса товаров, запись данных о платеже) выполнены успешно.
BEGIN TRANSACTION;

INSERT INTO orders (user_id, order_date) VALUES (1, NOW());
UPDATE products SET stock = stock - 1 WHERE product_id = 101;
INSERT INTO payments (order_id, amount) VALUES (LAST_INSERT_ID(), 99.99);

COMMIT; -- Если все операции прошли успешно
-- ROLLBACK; -- Если произошла ошибка


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое миграции?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое extend?

В PHP extends используется для наследования классов. Он позволяет одному классу (дочернему) наследовать свойства и методы другого класса (родительского).

🚩Пример наследования через `extends`

Базовый пример (extends)
class Animal {
public function makeSound() {
return "Какой-то звук";
}
}

class Dog extends Animal {
public function makeSound() {
return "Гав-гав!";
}
}

$dog = new Dog();
echo $dog->makeSound(); // "Гав-гав!"


Использование parent:: для вызова родительского метода
class Animal {
public function makeSound() {
return "Какой-то звук";
}
}

class Cat extends Animal {
public function makeSound() {
return parent::makeSound() . " Мяу-мяу!";
}
}

$cat = new Cat();
echo $cat->makeSound(); // "Какой-то звук Мяу-мяу!"


Наследование свойств
class User {
protected string $role = "Гость";

public function getRole() {
return $this->role;
}
}

class Admin extends User {
protected string $role = "Администратор";
}

$admin = new Admin();
echo $admin->getRole(); // "Администратор"


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Для чего нужен ELT?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как работает зацепление?

Зацепление (coupling) — это степень зависимости одного модуля от другого. В PHP (и вообще в разработке) мы стремимся уменьшить зацепление, чтобы код был гибким, удобным для тестирования и сопровождения.

🚩Виды зацепления

🟠Слабое зацепление (Loose Coupling) – Хорошо
- Модули мало зависят друг от друга.
- Можно заменять части системы без изменений в других частях.
- Используется интерфейсы, DI (Dependency Injection), события.
interface Logger {
public function log($message);
}

class FileLogger implements Logger {
public function log($message) {
echo "Запись в файл: $message\n";
}
}

class DatabaseLogger implements Logger {
public function log($message) {
echo "Запись в базу: $message\n";
}
}

class User {
private $logger;

public function __construct(Logger $logger) {
$this->logger = $logger;
}

public function register($name) {
echo "Регистрация пользователя: $name\n";
$this->logger->log("Пользователь $name зарегистрирован.");
}
}

// Можно легко менять логгер без изменения класса User
$user = new User(new FileLogger());
$user->register("Иван");

$user = new User(new DatabaseLogger());
$user->register("Петр");


🟠Жёсткое зацепление (Tight Coupling) – Плохо
- Модули сильно связаны, нельзя поменять один без изменения другого.
- Код трудно тестировать и расширять.
- Используется жёсткая привязка классов внутри других классов.
class FileLogger {
public function log($message) {
echo "Запись в файл: $message\n";
}
}

class User {
private $logger;

public function __construct() {
$this->logger = new FileLogger(); // Жесткая зависимость!
}

public function register($name) {
echo "Регистрация пользователя: $name\n";
$this->logger->log("Пользователь $name зарегистрирован.");
}
}

// User всегда использует FileLogger, его нельзя легко заменить
$user = new User();
$user->register("Иван");


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое Rest

REST (Representational State Transfer) — это архитектурный стиль для разработки веб-сервисов. Он основывается на стандартах HTTP и включает использование простых методов (GET, POST, PUT, DELETE) для взаимодействия с ресурсами, представленных в виде URL. RESTful API являются безсессионными, и каждый запрос от клиента к серверу должен содержать всю необходимую информацию для выполнения операции.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 В чем разница кэширования, кодирования, шифрования?

🚩Кэширование – для быстродействия

Кэширование – это временное хранение данных, чтобы избежать повторных вычислений или загрузок.
Пример кэширования (PHP + Redis)
$cacheKey = "user_123";
$cachedData = $redis->get($cacheKey);

if ($cachedData === false) {
$user = getUserFromDatabase(123);
$redis->set($cacheKey, json_encode($user), 3600); // Кэшируем на 1 час
} else {
$user = json_decode($cachedData, true);
}


🚩Кодирование – для совместимости

Кодирование (Encoding) – это преобразование данных в другой формат, чтобы их можно было передавать или хранить.
Пример кодирования в Base64 (PHP)
$original = "Hello, World!";
$encoded = base64_encode($original);
echo $encoded; // "SGVsbG8sIFdvcmxkIQ=="

$decoded = base64_decode($encoded);
echo $decoded; // "Hello, World!"


🚩Шифрование – для безопасности

Шифрование (Encryption) – это преобразование данных в секретный формат с помощью ключа, чтобы их нельзя было прочитать без расшифровки.
Пример шифрования AES-256 (PHP + OpenSSL)
$key = "supersecretkey123456"; // Должен быть длинным!
$data = "Пароль123";

$encrypted = openssl_encrypt($data, "AES-256-CBC", $key, 0, "1234567812345678");
echo $encrypted; // 🔐 Зашифрованный текст

$decrypted = openssl_decrypt($encrypted, "AES-256-CBC", $key, 0, "1234567812345678");
echo $decrypted; // "Пароль123"


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊3
🤔 Что такое Cookies?

Это небольшие файлы, которые хранят данные на стороне клиента (в браузере). Они используются для:
1. Идентификации пользователя и управления сессиями.
2. Сохранения предпочтений пользователя.
3. Отслеживания активности пользователя на сайте.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1