🤔 Чем класс отличается от объекта?
1. Класс — это шаблон или "чертёж", описывающий свойства и поведение объектов.
2. Объект — это экземпляр класса, созданный с использованием его структуры.
3. Класс определяет, что объект может делать, а объект выполняет это поведение.
4. Класс — это абстракция, объект — конкретное воплощение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
2. Объект — это экземпляр класса, созданный с использованием его структуры.
3. Класс определяет, что объект может делать, а объект выполняет это поведение.
4. Класс — это абстракция, объект — конкретное воплощение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое автоматическая загрузка классов?
Автоматическая загрузка классов (Autoloading) — это механизм, который позволяет не подключать вручную файлы с классами с помощью
🚩Как работает автозагрузка?
Без автозагрузки (ручное подключение)
С автозагрузкой (PHP сам загружает классы)
🚩Современный способ – автозагрузка через Composer
Если проект использует Composer, можно настроить автозагрузку по стандарту PSR-4.
1⃣В
2⃣В папке
-
-
3⃣Запускаем команду
4⃣Теперь можно использовать классы без
Ставь 👍 и забирай 📚 Базу знаний
Автоматическая загрузка классов (Autoloading) — это механизм, который позволяет не подключать вручную файлы с классами с помощью
require или include. Вместо этого PHP автоматически загружает нужный класс при его первом использовании. 🚩Как работает автозагрузка?
Без автозагрузки (ручное подключение)
require_once "Car.php";
require_once "Bike.php";
$car = new Car();
$bike = new Bike();
С автозагрузкой (PHP сам загружает классы)
spl_autoload_register(function ($class) {
require_once $class . ".php";
});
$car = new Car(); // PHP сам загрузит "Car.php"
$bike = new Bike(); // PHP сам загрузит "Bike.php"🚩Современный способ – автозагрузка через Composer
Если проект использует Composer, можно настроить автозагрузку по стандарту PSR-4.
1⃣В
composer.json добавляем:"autoload": {
"psr-4": {
"App\\": "src/"
}
}2⃣В папке
src/ создаём классы, например -
src/Car.php -
src/Bike.php 3⃣Запускаем команду
composer dump-autoload
4⃣Теперь можно использовать классы без
require:require 'vendor/autoload.php';
use App\Car;
use App\Bike;
$car = new Car();
$bike = new Bike();
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое транзакция?
Транзакция — это последовательность операций с базой данных, которые выполняются как единое целое. Транзакции обеспечивают целостность данных, гарантируя, что все операции будут завершены успешно или, в случае ошибки, откатятся к исходному состоянию. Основные свойства транзакций описываются понятием ACID: атомарность, согласованность, изолированность и долговечность. Транзакции часто используются для обеспечения надежности при работе с критически важными данными.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Чем HTTP первой версии отличается от второй?
HTTP/1.1 и HTTP/2 — это две версии протокола передачи гипертекста (HTTP), которые имеют ряд ключевых отличий. Каждая версия протокола внесла значительные улучшения в эффективность, производительность и возможности веб-коммуникации.
🚩HTTP/1.1
🟠Постоянные соединения
По умолчанию соединения остаются открытыми после завершения запроса, что позволяет отправлять несколько запросов по одному соединению и уменьшает нагрузку на сеть и серверы.
🟠Кэширование
Введены более сложные механизмы кэширования с использованием заголовков
🟠Коды состояния HTTP
Добавлены новые коды состояния для более точного представления различных сценариев веб-взаимодействия.
🟠Чанковая передача данных
Поддержка передачи данных в частях (chunks), что позволяет динамически генерировать содержимое и отправлять его по мере готовности.
🟠Хосты и виртуальные хосты
Поддержка заголовка
🚩HTTP/2
🟠Бинарный протокол
В отличие от текстового HTTP/1.1, HTTP/2 использует бинарный формат, который упрощает и ускоряет его разбор.
🟠Мультиплексирование
Одно соединение теперь может одновременно передавать несколько потоков данных, что устраняет проблему "заголовочного блока" и значительно повышает производительность.
🟠Управление потоками
HTTP/2 позволяет приоритизировать запросы, что улучшает загрузку ресурсов на странице.
🟠Сжатие заголовков
В HTTP/2 используется сжатие заголовков HPACK для уменьшения накладных расходов, связанных с метаданными HTTP.
🟠Server Push
Серверы могут активно отправлять ресурсы клиенту до того, как клиент явно запросит их, что улучшает время загрузки страниц.
Ставь 👍 и забирай 📚 Базу знаний
HTTP/1.1 и HTTP/2 — это две версии протокола передачи гипертекста (HTTP), которые имеют ряд ключевых отличий. Каждая версия протокола внесла значительные улучшения в эффективность, производительность и возможности веб-коммуникации.
🚩HTTP/1.1
🟠Постоянные соединения
По умолчанию соединения остаются открытыми после завершения запроса, что позволяет отправлять несколько запросов по одному соединению и уменьшает нагрузку на сеть и серверы.
🟠Кэширование
Введены более сложные механизмы кэширования с использованием заголовков
ETag, If-Modified-Since, что улучшает управление кэшем и эффективность передачи данных.🟠Коды состояния HTTP
Добавлены новые коды состояния для более точного представления различных сценариев веб-взаимодействия.
🟠Чанковая передача данных
Поддержка передачи данных в частях (chunks), что позволяет динамически генерировать содержимое и отправлять его по мере готовности.
🟠Хосты и виртуальные хосты
Поддержка заголовка
Host, позволяющего размещать несколько доменов на одном IP-адресе.🚩HTTP/2
🟠Бинарный протокол
В отличие от текстового HTTP/1.1, HTTP/2 использует бинарный формат, который упрощает и ускоряет его разбор.
🟠Мультиплексирование
Одно соединение теперь может одновременно передавать несколько потоков данных, что устраняет проблему "заголовочного блока" и значительно повышает производительность.
🟠Управление потоками
HTTP/2 позволяет приоритизировать запросы, что улучшает загрузку ресурсов на странице.
🟠Сжатие заголовков
В HTTP/2 используется сжатие заголовков HPACK для уменьшения накладных расходов, связанных с метаданными HTTP.
🟠Server Push
Серверы могут активно отправлять ресурсы клиенту до того, как клиент явно запросит их, что улучшает время загрузки страниц.
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Какими способами организовать порции?
Разделение данных на порции (batch processing) может быть организовано разными методами:
1. LIMIT и OFFSET – классический способ для пагинации в SQL.
2. Cursor-based pagination – используется в API, позволяет получать новые данные без смещения.
3. Частичная загрузка данных – загружать данные по мере необходимости (lazy loading).
4. Очереди (Message Queues) – например, RabbitMQ или Kafka для обработки данных в потоках.
5. Шардирование данных – разделение больших таблиц на более мелкие логические части.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Разделение данных на порции (batch processing) может быть организовано разными методами:
1. LIMIT и OFFSET – классический способ для пагинации в SQL.
2. Cursor-based pagination – используется в API, позволяет получать новые данные без смещения.
3. Частичная загрузка данных – загружать данные по мере необходимости (lazy loading).
4. Очереди (Message Queues) – например, RabbitMQ или Kafka для обработки данных в потоках.
5. Шардирование данных – разделение больших таблиц на более мелкие логические части.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое составной индекс?
Составной индекс (Composite Index) – это индекс, который создаётся сразу на несколько колонок таблицы.
🚩Как работает составной индекс?
🟠Пример без индекса (медленный поиск)
Допустим, у нас есть таблица
И мы выполняем поиск по
Создаём составной индекс (ускоряем поиск)
Как SQL использует составной индекс? (Правило слева направо)
Важный момент: составной индекс работает слева направо.
НЕ работает
Ставь 👍 и забирай 📚 Базу знаний
Составной индекс (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 пропущен)
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что из себя представляет http-запрос?
HTTP-запрос — это сообщение, которое клиент отправляет серверу для выполнения определённой операции, например получения данных (GET) или их отправки (POST). Запрос содержит метод, URL, заголовки и тело запроса (если необходимо). Ответ сервера включает статус выполнения, заголовки и данные (если применимо).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какие протоколы ты знаешь?
Протоколы в сетевых системах обеспечивают правила передачи данных. Они работают на разных уровнях модели OSI и TCP/IP. Вот основные виды протоколов:
🚩Основные виды протоколов
🟠Физический и канальный уровни
Ethernet: Передача данных по проводным сетям.
Wi-Fi (IEEE 802.11): Беспроводная передача данных.
PPP (Point-to-Point Protocol): Соединение между двумя узлами.
HDLC (High-Level Data Link Control): Передача данных на канальном уровне.
🟠Сетевой уровень
IP (Internet Protocol): Основной протокол для передачи данных в интернете (IPv4 и IPv6).
ICMP (Internet Control Message Protocol): Передача сообщений об ошибках и контроля.
🟠Транспортный уровень
TCP (Transmission Control Protocol): Надежная передача данных.
UDP (User Datagram Protocol): Быстрая, но ненадежная передача данных.
🟠Сеансовый и представительный уровни
SSL/TLS (Secure Sockets Layer / Transport Layer Security): Обеспечение безопасности передачи данных.
NetBIOS: Работа сетевых приложений в локальных сетях.
🟠Прикладной уровень
HTTP/HTTPS (HyperText Transfer Protocol / Secure): Передача веб-страниц.
FTP (File Transfer Protocol): Передача файлов.
SMTP (Simple Mail Transfer Protocol): Передача электронной почты.
POP3/IMAP: Получение электронной почты.
DNS (Domain Name System): Преобразование доменных имен в IP-адреса.
SSH (Secure Shell): Безопасное удаленное управление серверами.
SNMP (Simple Network Management Protocol): Управление сетевыми устройствами.
LDAP (Lightweight Directory Access Protocol): Доступ и управление каталогами.
DHCP (Dynamic Host Configuration Protocol): Динамическое назначение IP-адресов.
🟠Специализированные протоколы
VoIP (Voice over IP): Передача голосовых данных (SIP, RTP).
MQTT (Message Queuing Telemetry Transport): Обмен сообщениями в IoT.
CoAP (Constrained Application Protocol): Работа с ограниченными устройствами в IoT.
Ставь 👍 и забирай 📚 Базу знаний
Протоколы в сетевых системах обеспечивают правила передачи данных. Они работают на разных уровнях модели OSI и TCP/IP. Вот основные виды протоколов:
🚩Основные виды протоколов
🟠Физический и канальный уровни
Ethernet: Передача данных по проводным сетям.
Wi-Fi (IEEE 802.11): Беспроводная передача данных.
PPP (Point-to-Point Protocol): Соединение между двумя узлами.
HDLC (High-Level Data Link Control): Передача данных на канальном уровне.
🟠Сетевой уровень
IP (Internet Protocol): Основной протокол для передачи данных в интернете (IPv4 и IPv6).
ICMP (Internet Control Message Protocol): Передача сообщений об ошибках и контроля.
🟠Транспортный уровень
TCP (Transmission Control Protocol): Надежная передача данных.
UDP (User Datagram Protocol): Быстрая, но ненадежная передача данных.
🟠Сеансовый и представительный уровни
SSL/TLS (Secure Sockets Layer / Transport Layer Security): Обеспечение безопасности передачи данных.
NetBIOS: Работа сетевых приложений в локальных сетях.
🟠Прикладной уровень
HTTP/HTTPS (HyperText Transfer Protocol / Secure): Передача веб-страниц.
FTP (File Transfer Protocol): Передача файлов.
SMTP (Simple Mail Transfer Protocol): Передача электронной почты.
POP3/IMAP: Получение электронной почты.
DNS (Domain Name System): Преобразование доменных имен в IP-адреса.
SSH (Secure Shell): Безопасное удаленное управление серверами.
SNMP (Simple Network Management Protocol): Управление сетевыми устройствами.
LDAP (Lightweight Directory Access Protocol): Доступ и управление каталогами.
DHCP (Dynamic Host Configuration Protocol): Динамическое назначение IP-адресов.
🟠Специализированные протоколы
VoIP (Voice over IP): Передача голосовых данных (SIP, RTP).
MQTT (Message Queuing Telemetry Transport): Обмен сообщениями в IoT.
CoAP (Constrained Application Protocol): Работа с ограниченными устройствами в IoT.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое Low Coupling и High Cohesion?
• Low Coupling (низкая связанность): уменьшение зависимости между модулями, чтобы изменения в одном модуле минимально затрагивали другие.
• High Cohesion (высокая связность): логически связанные функции и данные группируются в одном модуле, делая его функционально независимым.
Совмещение этих принципов упрощает сопровождение и тестирование кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
• Low Coupling (низкая связанность): уменьшение зависимости между модулями, чтобы изменения в одном модуле минимально затрагивали другие.
• High Cohesion (высокая связность): логически связанные функции и данные группируются в одном модуле, делая его функционально независимым.
Совмещение этих принципов упрощает сопровождение и тестирование кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое метрики?
Это количественные показатели, используемые для оценки, мониторинга и улучшения различных аспектов работы систем, процессов и проектов. Они предоставляют объективные данные, которые помогают принимать обоснованные решения и улучшать эффективность и качество работы.
🚩Зачем нужны метрики
🟠Измерение производительности
Метрики позволяют оценивать, насколько эффективно работают системы или процессы. Например, метрики производительности могут показать, сколько запросов обрабатывается сервером в секунду или как быстро выполняются алгоритмы.
🟠Мониторинг и контроль
Постоянный мониторинг метрик помогает выявлять проблемы на ранних стадиях. Например, мониторинг времени отклика сервера позволяет обнаружить ухудшение производительности до того, как это повлияет на пользователей.
🟠Принятие решений
Объективные данные, предоставляемые метриками, помогают принимать обоснованные решения по улучшению процессов, распределению ресурсов и планированию. Например, данные о загрузке серверов могут помочь определить, когда нужно добавить новые ресурсы.
🟠Улучшение качества
Метрики качества позволяют оценивать, насколько хорошо продукт или процесс соответствует установленным стандартам и требованиям. Например, метрики кода, такие как количество ошибок или покрытие тестами, помогают улучшать качество программного обеспечения.
🟠Управление проектами
В проектном управлении метрики помогают следить за прогрессом, оценивать риски и управлять ресурсами. Например, метрики времени и затрат помогают следить за выполнением проекта в рамках бюджета и сроков.
🚩Примеры метрик
🟠Метрики производительности
Время отклика (Response Time): Время, за которое система обрабатывает запрос.
Пропускная способность (Throughput): Количество запросов, обработанных системой за единицу времени.
Время простоя (Downtime): Время, в течение которого система недоступна.
🟠Метрики качества программного обеспечения
Покрытие тестами (Test Coverage): Процент кода, покрытого автоматизированными тестами.
Количество ошибок (Bug Count): Количество ошибок, обнаруженных в программном обеспечении.
Плотность дефектов (Defect Density): Количество ошибок на единицу кода (например, на 1000 строк кода).
🟠Метрики управления проектами
Завершение задач (Task Completion): Процент выполненных задач от общего количества задач в проекте.
Отклонение от плана (Schedule Variance): Разница между планируемым и фактическим временем выполнения задач.
Затраты (Cost): Фактические затраты по сравнению с запланированными затратами.
🚩Применение метрик
🟠В разработке программного обеспечения
CI/CD: Метрики сборок и развертываний помогают отслеживать стабильность и скорость релизов.
Анализ кода: Метрики сложности кода, дублирования и покрытия тестами помогают улучшать качество и поддерживаемость кода.
🟠В бизнесе и управлении
KPI (Key Performance Indicators): Ключевые показатели эффективности помогают оценивать успехи бизнеса или отдельных процессов.
OKR (Objectives and Key Results): Цели и ключевые результаты помогают ставить и достигать стратегические цели.
🟠В IT-инфраструктуре
Мониторинг серверов: Метрики использования CPU, памяти, дискового пространства помогают поддерживать высокую производительность и доступность серверов.
Безопасность: Метрики инцидентов безопасности, обнаружения уязвимостей и реагирования на угрозы помогают обеспечивать защиту данных и систем.
Ставь 👍 и забирай 📚 Базу знаний
Это количественные показатели, используемые для оценки, мониторинга и улучшения различных аспектов работы систем, процессов и проектов. Они предоставляют объективные данные, которые помогают принимать обоснованные решения и улучшать эффективность и качество работы.
🚩Зачем нужны метрики
🟠Измерение производительности
Метрики позволяют оценивать, насколько эффективно работают системы или процессы. Например, метрики производительности могут показать, сколько запросов обрабатывается сервером в секунду или как быстро выполняются алгоритмы.
🟠Мониторинг и контроль
Постоянный мониторинг метрик помогает выявлять проблемы на ранних стадиях. Например, мониторинг времени отклика сервера позволяет обнаружить ухудшение производительности до того, как это повлияет на пользователей.
🟠Принятие решений
Объективные данные, предоставляемые метриками, помогают принимать обоснованные решения по улучшению процессов, распределению ресурсов и планированию. Например, данные о загрузке серверов могут помочь определить, когда нужно добавить новые ресурсы.
🟠Улучшение качества
Метрики качества позволяют оценивать, насколько хорошо продукт или процесс соответствует установленным стандартам и требованиям. Например, метрики кода, такие как количество ошибок или покрытие тестами, помогают улучшать качество программного обеспечения.
🟠Управление проектами
В проектном управлении метрики помогают следить за прогрессом, оценивать риски и управлять ресурсами. Например, метрики времени и затрат помогают следить за выполнением проекта в рамках бюджета и сроков.
🚩Примеры метрик
🟠Метрики производительности
Время отклика (Response Time): Время, за которое система обрабатывает запрос.
Пропускная способность (Throughput): Количество запросов, обработанных системой за единицу времени.
Время простоя (Downtime): Время, в течение которого система недоступна.
🟠Метрики качества программного обеспечения
Покрытие тестами (Test Coverage): Процент кода, покрытого автоматизированными тестами.
Количество ошибок (Bug Count): Количество ошибок, обнаруженных в программном обеспечении.
Плотность дефектов (Defect Density): Количество ошибок на единицу кода (например, на 1000 строк кода).
🟠Метрики управления проектами
Завершение задач (Task Completion): Процент выполненных задач от общего количества задач в проекте.
Отклонение от плана (Schedule Variance): Разница между планируемым и фактическим временем выполнения задач.
Затраты (Cost): Фактические затраты по сравнению с запланированными затратами.
🚩Применение метрик
🟠В разработке программного обеспечения
CI/CD: Метрики сборок и развертываний помогают отслеживать стабильность и скорость релизов.
Анализ кода: Метрики сложности кода, дублирования и покрытия тестами помогают улучшать качество и поддерживаемость кода.
🟠В бизнесе и управлении
KPI (Key Performance Indicators): Ключевые показатели эффективности помогают оценивать успехи бизнеса или отдельных процессов.
OKR (Objectives and Key Results): Цели и ключевые результаты помогают ставить и достигать стратегические цели.
🟠В IT-инфраструктуре
Мониторинг серверов: Метрики использования CPU, памяти, дискового пространства помогают поддерживать высокую производительность и доступность серверов.
Безопасность: Метрики инцидентов безопасности, обнаружения уязвимостей и реагирования на угрозы помогают обеспечивать защиту данных и систем.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое ACID?
ACID — это акроним, обозначающий четыре ключевых свойства транзакций в базах данных: Atomicity (атомарность), Consistency (согласованность), Isolation (изоляция), Durability (устойчивость). Эти свойства гарантируют надежное выполнение транзакций.?
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое агрегат?
Агрегат – это термин, часто используемый в области баз данных и программирования, который обозначает способ группировки данных для выполнения различных операций, таких как суммирование, подсчёт, нахождение среднего значения и другие. В реляционных базах данных агрегаты применяются для выполнения агрегатных функций, таких как
🚩Зачем нужны?
🟠Анализ данных:
Агрегаты позволяют получить сводные данные, которые помогают анализировать и понимать большие наборы данных. Например, можно узнать общее количество продаж, среднюю стоимость заказа, максимальную и минимальную зарплату сотрудников и т.д.
🟠Оптимизация запросов:
Использование агрегатных функций позволяет выполнять сложные вычисления на сервере базы данных, что экономит время и ресурсы по сравнению с выполнением этих операций на клиентской стороне.
🚩Примеры использования агрегатных функций:
Суммирование (
Подсчёт (
Среднее значение (
Максимальное значение (
Минимальное значение (
🚩 Группировка данных с использованием GROUP BY:
Для более сложных запросов можно использовать агрегатные функции вместе с оператором
Ставь 👍 и забирай 📚 Базу знаний
Агрегат – это термин, часто используемый в области баз данных и программирования, который обозначает способ группировки данных для выполнения различных операций, таких как суммирование, подсчёт, нахождение среднего значения и другие. В реляционных базах данных агрегаты применяются для выполнения агрегатных функций, таких как
SUM(), COUNT(), AVG(), MAX(), MIN() и других.🚩Зачем нужны?
🟠Анализ данных:
Агрегаты позволяют получить сводные данные, которые помогают анализировать и понимать большие наборы данных. Например, можно узнать общее количество продаж, среднюю стоимость заказа, максимальную и минимальную зарплату сотрудников и т.д.
🟠Оптимизация запросов:
Использование агрегатных функций позволяет выполнять сложные вычисления на сервере базы данных, что экономит время и ресурсы по сравнению с выполнением этих операций на клиентской стороне.
🚩Примеры использования агрегатных функций:
Суммирование (
SUM):-- Получение общей суммы всех заказов
SELECT SUM(total_amount) AS total_sales
FROM orders;
Подсчёт (
COUNT):-- Подсчёт общего количества заказов
SELECT COUNT(*) AS total_orders
FROM orders;
Среднее значение (
AVG):-- Нахождение средней суммы заказа
SELECT AVG(total_amount) AS average_order_value
FROM orders;
Максимальное значение (
MAX):-- Нахождение максимальной суммы заказа
SELECT MAX(total_amount) AS max_order_value
FROM orders;
Минимальное значение (
MIN):-- Нахождение минимальной суммы заказа
SELECT MIN(total_amount) AS min_order_value
FROM orders;
🚩 Группировка данных с использованием GROUP BY:
Для более сложных запросов можно использовать агрегатные функции вместе с оператором
GROUP BY, чтобы группировать данные по определённому критерию. В этом запросе результаты будут сгруппированы по customer_id, и для каждого клиента будет рассчитана общая сумма заказов.-- Получение общей суммы заказов для каждого клиента
SELECT customer_id, SUM(total_amount) AS total_sales_per_customer
FROM orders
GROUP BY customer_id;
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое ООП?
Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на концепции классов и объектов. Основные принципы ООП включают инкапсуляцию (скрытие деталей реализации), наследование (передача поведения от одного класса к другому), полиморфизм (способность методов работать с разными типами объектов) и абстракцию (выделение важной функциональности). ООП помогает организовывать код в удобные для понимания и поддерживаемые структуры.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое di container?
Это специальный инструмент или объект в программировании, который управляет созданием и внедрением зависимостей в объекты. Этот контейнер автоматически решает, какие зависимости требуются объекту, и предоставляет их при создании объекта, тем самым упрощая управление зависимостями в приложении.
🚩Зачем нужен DI-контейнер
🟠Автоматизация управления зависимостями
DI-контейнер автоматически создает и внедряет зависимости, избавляя от необходимости вручную передавать их в объекты.
🟠Гибкость и модульность
Позволяет легко заменять реализации зависимостей, не изменяя код, который их использует.
🟠Упрощение тестирования
Обеспечивает легкую замену зависимостей на моки или заглушки для тестирования.
🟠Улучшение структуры кода
Разделяет создание объектов и их использование, способствуя более чистой архитектуре.
🚩Как используется DI-контейнер
DI-контейнеры предоставляют различные методы для регистрации зависимостей и их последующего получения. Ниже приведен пример реализации простого DI-контейнера.
1⃣Создание интерфейсов и реализаций зависимостей
2⃣Реализация DI-контейнера
3⃣Регистрация зависимостей и их использование
🚩Плюсы и минусы
➕Автоматизация
Снижает необходимость ручного создания и передачи зависимостей.
➕Гибкость
Легко изменять конкретные реализации зависимостей.
➕Тестируемость
Упрощает замену зависимостей на моки для тестирования.
➕Чистота кода
Упрощает код, делая его более модульным и читаемым.
➖Сложность настройки
Могут потребоваться значительные усилия для первоначальной настройки DI-контейнера.
➖Производительность
В некоторых случаях может снижать производительность из-за необходимости разрешения зависимостей.
Ставь 👍 и забирай 📚 Базу знаний
Это специальный инструмент или объект в программировании, который управляет созданием и внедрением зависимостей в объекты. Этот контейнер автоматически решает, какие зависимости требуются объекту, и предоставляет их при создании объекта, тем самым упрощая управление зависимостями в приложении.
🚩Зачем нужен DI-контейнер
🟠Автоматизация управления зависимостями
DI-контейнер автоматически создает и внедряет зависимости, избавляя от необходимости вручную передавать их в объекты.
🟠Гибкость и модульность
Позволяет легко заменять реализации зависимостей, не изменяя код, который их использует.
🟠Упрощение тестирования
Обеспечивает легкую замену зависимостей на моки или заглушки для тестирования.
🟠Улучшение структуры кода
Разделяет создание объектов и их использование, способствуя более чистой архитектуре.
🚩Как используется DI-контейнер
DI-контейнеры предоставляют различные методы для регистрации зависимостей и их последующего получения. Ниже приведен пример реализации простого DI-контейнера.
1⃣Создание интерфейсов и реализаций зависимостей
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
echo "Logging message to a file: $message";
}
}
interface PaymentProcessor {
public function processPayment($amount);
}
class StripePaymentProcessor implements PaymentProcessor {
public function processPayment($amount) {
echo "Processing payment of $amount through Stripe";
}
}2⃣Реализация DI-контейнера
class DIContainer {
private $bindings = [];
public function bind($abstract, $concrete) {
$this->bindings[$abstract] = $concrete;
}
public function resolve($abstract) {
if (!isset($this->bindings[$abstract])) {
throw new Exception("No binding found for $abstract");
}
$concrete = $this->bindings[$abstract];
// Если $concrete является замыканием, вызываем его
if ($concrete instanceof Closure) {
return $concrete($this);
}
// Создаем новый объект конкретного класса
return new $concrete;
}
}3⃣Регистрация зависимостей и их использование
$container = new DIContainer();
// Регистрация зависимостей
$container->bind(Logger::class, FileLogger::class);
$container->bind(PaymentProcessor::class, function($container) {
return new StripePaymentProcessor();
});
// Получение зависимостей
$logger = $container->resolve(Logger::class);
$logger->log("This is a log message."); // Вывод: Logging message to a file: This is a log message.
$paymentProcessor = $container->resolve(PaymentProcessor::class);
$paymentProcessor->processPayment(100); // Вывод: Processing payment of 100 through Stripe
🚩Плюсы и минусы
➕Автоматизация
Снижает необходимость ручного создания и передачи зависимостей.
➕Гибкость
Легко изменять конкретные реализации зависимостей.
➕Тестируемость
Упрощает замену зависимостей на моки для тестирования.
➕Чистота кода
Упрощает код, делая его более модульным и читаемым.
➖Сложность настройки
Могут потребоваться значительные усилия для первоначальной настройки DI-контейнера.
➖Производительность
В некоторых случаях может снижать производительность из-за необходимости разрешения зависимостей.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое DRY и KISS?
Они помогают писать чистый, понятный и эффективный код.
🟠DRY (Don't Repeat Yourself – Не повторяйся)
Смысл: Избегайте дублирования кода, выносите повторяющуюся логику в функции, классы или модули.
Улучшает читаемость кода.
Упрощает поддержку: изменили код в одном месте – обновилось везде.
Исключает ошибки при дублировании кода.
Плохо (нарушение DRY)
Хорошо (принцип DRY)
🟠KISS (Keep It Simple, Stupid – Делай проще)
Смысл: Не усложняйте код, он должен быть простым и понятным.
Код легче понимать и исправлять.
Простота = меньше ошибок.
Улучшает производительность (сложные конструкции могут замедлять код).
Плохо (нарушение KISS)
Хорошо (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;
}Ставь 👍 и забирай 📚 Базу знаний
🤔 Какие типы объединений есть в таблицах?
Типы объединений: INNER JOIN (только совпадающие строки), LEFT JOIN (все строки из левой таблицы), RIGHT JOIN (все строки из правой таблицы), FULL JOIN (объединение всех строк обеих таблиц), CROSS JOIN (декартово произведение), SELF JOIN (объединение таблицы с самой собой).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Типы объединений: INNER JOIN (только совпадающие строки), LEFT JOIN (все строки из левой таблицы), RIGHT JOIN (все строки из правой таблицы), FULL JOIN (объединение всех строк обеих таблиц), CROSS JOIN (декартово произведение), SELF JOIN (объединение таблицы с самой собой).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Расскажи о Unit tests
Unit-тесты (или модульные тесты) — это тесты, которые проверяют работу отдельных модулей (функций, классов, методов) в коде. Они позволяют убедиться, что каждый компонент программы работает правильно в изоляции от других частей системы.
🚩Зачем нужны Unit-тесты?
🟠Раннее выявление ошибок
тесты помогают обнаружить баги сразу после написания кода.
🟠Упрощение рефакторинга
при изменении кода можно быстро проверить, не сломалось ли что-то.
🟠Уверенность в качестве кода
тесты показывают, что функции работают так, как задумано.
🟠Автоматизация тестирования
можно запускать тесты автоматически перед каждым релизом.
🟠Документирование кода
тесты помогают понять, как должна работать функция.
🚩Как писать Unit-тесты в PHP?
В PHP для написания тестов чаще всего используют PHPUnit – это популярный фреймворк для модульного тестирования.
Устанавливаем через Composer:
🚩Пример Unit-теста
Допустим, у нас есть функция в классе
Теперь создадим тест для проверки работы метода
🚩Запуск тестов
Чтобы запустить тест, используем команду
Ставь 👍 и забирай 📚 Базу знаний
Unit-тесты (или модульные тесты) — это тесты, которые проверяют работу отдельных модулей (функций, классов, методов) в коде. Они позволяют убедиться, что каждый компонент программы работает правильно в изоляции от других частей системы.
🚩Зачем нужны Unit-тесты?
🟠Раннее выявление ошибок
тесты помогают обнаружить баги сразу после написания кода.
🟠Упрощение рефакторинга
при изменении кода можно быстро проверить, не сломалось ли что-то.
🟠Уверенность в качестве кода
тесты показывают, что функции работают так, как задумано.
🟠Автоматизация тестирования
можно запускать тесты автоматически перед каждым релизом.
🟠Документирование кода
тесты помогают понять, как должна работать функция.
🚩Как писать Unit-тесты в PHP?
В PHP для написания тестов чаще всего используют PHPUnit – это популярный фреймворк для модульного тестирования.
Устанавливаем через Composer:
composer require --dev phpunit/phpunit
🚩Пример Unit-теста
Допустим, у нас есть функция в классе
Calculator, которая складывает два числаclass Calculator {
public function add($a, $b) {
return $a + $b;
}
}Теперь создадим тест для проверки работы метода
adduse PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase {
public function testAdd() {
$calc = new Calculator();
$result = $calc->add(2, 3);
$this->assertEquals(5, $result);
}
}
🚩Запуск тестов
Чтобы запустить тест, используем команду
vendor/bin/phpunit tests
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое динамические переменные?
Это переменные, имена которых определяются во время выполнения программы. Это позволяет создавать, модифицировать или обращаться к переменным динамически, основываясь на входных данных или условиях выполнения программы. Такой подход может быть полезен в сценариях, где структура данных неизвестна на момент написания кода или когда нужно генерировать переменные на лету в зависимости от контекста выполнения.
🚩PHP
Имена переменных могут быть динамически сформированы с использованием переменных переменных
Плюсы и минусы
➕Гибкость
позволяет создавать более адаптивные и динамические программы, которые могут работать с данными, структура которых заранее неизвестна.
➕Удобство
упрощает работу с большим количеством похожих переменных или свойств объекта без необходимости явного объявления каждой переменной.
➖Читаемость кода
использование динамических переменных может сделать код менее понятным и труднее для отладки, поскольку не всегда ясно, какие переменные создаются и используются.
➖Управление памятью
динамическое создание большого количества переменных может привести к неэффективному использованию памяти и снижению производительности.
Ставь 👍 и забирай 📚 Базу знаний
Это переменные, имена которых определяются во время выполнения программы. Это позволяет создавать, модифицировать или обращаться к переменным динамически, основываясь на входных данных или условиях выполнения программы. Такой подход может быть полезен в сценариях, где структура данных неизвестна на момент написания кода или когда нужно генерировать переменные на лету в зависимости от контекста выполнения.
🚩PHP
Имена переменных могут быть динамически сформированы с использованием переменных переменных
$name = "variable";
$$name = "Hello, World!";
echo $variable; // Выведет "Hello, World!"
Плюсы и минусы
➕Гибкость
позволяет создавать более адаптивные и динамические программы, которые могут работать с данными, структура которых заранее неизвестна.
➕Удобство
упрощает работу с большим количеством похожих переменных или свойств объекта без необходимости явного объявления каждой переменной.
➖Читаемость кода
использование динамических переменных может сделать код менее понятным и труднее для отладки, поскольку не всегда ясно, какие переменные создаются и используются.
➖Управление памятью
динамическое создание большого количества переменных может привести к неэффективному использованию памяти и снижению производительности.
Ставь 👍 и забирай 📚 Базу знаний
👍1🤔1
🤔 Какой принцип нарушает Active Record?
Это популярный шаблон проектирования, который используется для взаимодействия с базой данных. Он сочетает в себе логику бизнес-модели и работу с базой данных в одном объекте. Несмотря на свою популярность и удобство, Active Record нарушает принцип разделения ответственности (Single Responsibility Principle, SRP) из SOLID.
🚩Почему Active Record нарушает SRP?
SRP гласит, что класс должен иметь только одну причину для изменения, то есть заниматься только одной задачей.
🟠Логика бизнес-модели
Класс хранит правила и поведение, связанные с сущностью (например, вычисления, валидации, связи).
🟠Работа с базой данных
Класс отвечает за взаимодействие с базой данных, включая CRUD-операции (создание, чтение, обновление, удаление), построение SQL-запросов и т. д.
Таким образом, Active Record совмещает две разные ответственности: бизнес-логику и взаимодействие с базой данных. Если изменится структура базы данных или логика обработки данных, класс придется менять, что нарушает SRP.
🚩Альтернатива
Чтобы соблюсти SRP, можно разделить бизнес-логику и работу с базой данных на разные уровни:
🟠Data Mapper
Отвечает только за преобразование данных между объектами и базой данных.
🟠Сервисы
Обрабатывают бизнес-логику.
Ставь 👍 и забирай 📚 Базу знаний
Это популярный шаблон проектирования, который используется для взаимодействия с базой данных. Он сочетает в себе логику бизнес-модели и работу с базой данных в одном объекте. Несмотря на свою популярность и удобство, 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-запрос для сохранения данных
}
}Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое транзакции?
Это последовательности операций с базой данных, которые рассматриваются как единое целое. Они обеспечивают целостность данных, гарантируя, что либо все операции в транзакции выполнены успешно, либо никакие изменения не будут применены, если произошла ошибка.
🟠Atomicity (Атомарность)
Гарантирует, что все операции в рамках транзакции будут выполнены полностью или не будут выполнены вовсе. Если любая из операций внутри транзакции не удалась, все изменения откатываются.
🟠Consistency (Согласованность)
Обеспечивает перевод базы данных из одного согласованного состояния в другое. Транзакции должны оставлять базу данных в корректном состоянии, удовлетворяющем всем правилам и ограничениям.
🟠Isolation (Изолированность)
Обеспечивает изолированность транзакций друг от друга. Это означает, что результаты промежуточных операций одной транзакции невидимы для других транзакций до завершения первой транзакции.
🟠Durability (Долговечность)
Гарантирует, что изменения, внесённые успешно завершённой транзакцией, будут сохранены в базе данных даже в случае сбоя системы.
🚩Использования транзакций
🟠Перевод денег между счетами
Необходимо убедиться, что обе операции (списание и зачисление) выполнены успешно, чтобы избежать ситуации, когда деньги списаны, но не зачислены.
🟠Создание заказа в интернет-магазине
Важно убедиться, что все связанные операции (добавление записи о заказе, обновление статуса товаров, запись данных о платеже) выполнены успешно.
Ставь 👍 и забирай 📚 Базу знаний
Это последовательности операций с базой данных, которые рассматриваются как единое целое. Они обеспечивают целостность данных, гарантируя, что либо все операции в транзакции выполнены успешно, либо никакие изменения не будут применены, если произошла ошибка.
🟠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; -- Если произошла ошибка
Ставь 👍 и забирай 📚 Базу знаний
🤔 В чем преимущество hash индекс и btree индекс?
Hash-индексы и B-Tree-индексы являются двумя типами индексов, используемыми для ускорения операций поиска в базах данных. Оба типа имеют свои преимущества и недостатки в зависимости от конкретных сценариев использования.
🚩Hash-индексы
➕Быстрый доступ по точному совпадению
Hash-индексы обеспечивают очень быстрый доступ к данным при выполнении точных поисков (например,
➕Простота реализации
Hash-индексы просты в реализации и не требуют сложных структур данных для управления.
🚩B-Tree-индексы
➕Поддержка диапазонных запросов
B-Tree-индексы поддерживают операции поиска по диапазону и сортировку (например,
➕Сбалансированность
B-Tree автоматически поддерживает балансировку, что обеспечивает стабильную производительность для всех операций (поиск, вставка, удаление).
➕Универсальность
B-Tree-индексы поддерживают широкий спектр операций и типов данных, включая текстовые данные, даты и числа.
🟠Hash-индекс
Подходит для сценариев, где часто выполняются точные запросы равенства, например, поиск пользователя по уникальному идентификатору или email.
🟠B-Tree-индекс
Подходит для сценариев, где часто выполняются диапазонные запросы, сортировка или комбинированные условия.
Ставь 👍 и забирай 📚 Базу знаний
Hash-индексы и B-Tree-индексы являются двумя типами индексов, используемыми для ускорения операций поиска в базах данных. Оба типа имеют свои преимущества и недостатки в зависимости от конкретных сценариев использования.
🚩Hash-индексы
➕Быстрый доступ по точному совпадению
Hash-индексы обеспечивают очень быстрый доступ к данным при выполнении точных поисков (например,
SELECT * FROM table WHERE column = 'value'). Время поиска практически константное (O(1)), что делает такие запросы очень эффективными.➕Простота реализации
Hash-индексы просты в реализации и не требуют сложных структур данных для управления.
🚩B-Tree-индексы
➕Поддержка диапазонных запросов
B-Tree-индексы поддерживают операции поиска по диапазону и сортировку (например,
BETWEEN, >, <, ORDER BY). Данные в B-Tree отсортированы, что делает такие запросы возможными и эффективными.➕Сбалансированность
B-Tree автоматически поддерживает балансировку, что обеспечивает стабильную производительность для всех операций (поиск, вставка, удаление).
➕Универсальность
B-Tree-индексы поддерживают широкий спектр операций и типов данных, включая текстовые данные, даты и числа.
🟠Hash-индекс
Подходит для сценариев, где часто выполняются точные запросы равенства, например, поиск пользователя по уникальному идентификатору или email.
CREATE INDEX idx_email_hash ON users USING HASH (email);
SELECT * FROM users WHERE email = 'example@example.com';
🟠B-Tree-индекс
Подходит для сценариев, где часто выполняются диапазонные запросы, сортировка или комбинированные условия.
CREATE INDEX idx_name_btree ON users (name);
SELECT * FROM users WHERE name BETWEEN 'A' AND 'M';
Ставь 👍 и забирай 📚 Базу знаний