PHP | Вопросы собесов
2.32K subscribers
34 photos
1.51K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Что такое CQRS?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое Rest?

Это архитектурный стиль для создания веб-сервисов, который был предложен Роем Филдингом в его докторской диссертации в 2000 году. В его основе лежит принцип использования стандартных HTTP методов (GET, POST, PUT, DELETE и др.) для взаимодействия с ресурсами, представленными в виде URL.

🚩Основные принципы

🟠Адресуемость (Addressability)
Каждому ресурсу (например, пользователю, товару) соответствует уникальный URL.

🟠Использование стандартных методов HTTP
Использует методы HTTP для выполнения операций с ресурсами.
GET: Получение данных.
POST: Создание нового ресурса.
PUT: Обновление существующего ресурса.
DELETE: Удаление ресурса.

🟠Статусность (Statelessness)
Каждый запрос к серверу должен содержать всю необходимую информацию для его обработки. Сервер не хранит информацию о состоянии клиента между запросами.

🟠Кэширование (Caching)
Ответы от сервера могут кэшироваться, чтобы улучшить производительность и снизить нагрузку на сервер.

🟠Единообразие интерфейса (Uniform Interface)
Все взаимодействия между клиентом и сервером стандартизированы, что упрощает интеграцию и взаимодействие между системами.

🚩Примеры

🟠Получение списка пользователей (GET)
Запрос
GET /users


Ответ
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]


🟠Получение информации о конкретном пользователе (GET)
Запрос
GET /users/1


Ответ
{
"id": 1,
"name": "Alice"
}


🟠Создание нового пользователя (POST)
Запрос
POST /users
Content-Type: application/json

{
"name": "Charlie"
}


Ответ (Успешное создание)
{
"id": 3,
"name": "Charlie"
}


🟠Обновление информации о пользователе (PUT)
Запрос
PUT /users/1
Content-Type: application/json

{
"name": "Alice Updated"
}


Ответ
{
"id": 1,
"name": "Alice Updated"
}


🟠Удаление пользователя (DELETE)
Запрос
DELETE /users/1


Ответ (Успешное удаление)
{
"message": "User deleted"
}


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое динамическая типизация

Динамическая типизация — это свойство языка программирования, где тип переменной определяется во время выполнения, а не во время компиляции. Это позволяет использовать одну переменную для хранения данных разных типов, упрощая код, но также увеличивая вероятность ошибок, так как проверки типов происходят в процессе выполнения. Языки с динамической типизацией, такие как Python и JavaScript, предлагают большую гибкость, но требуют внимательности при работе с типами.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Чем отличается Require от Includ'а?

В PHP есть две схожие конструкции для подключения файлов: require и include. Однако между ними есть важные различия.

🟠Основное различие: Ошибки при отсутствии файла
require вызывает фатальную ошибку (Fatal Error), если указанный файл не найден или содержит ошибку. Это приведёт к немедленному завершению выполнения скрипта.
include вызывает предупреждение (Warning), но код продолжит выполняться дальше.
require 'somefile.php'; // Если файла нет, скрипт завершится с ошибкой
echo "Этот код не выполнится";


Результат (если файла somefile.php нет):
Fatal error: require(): Failed opening 'somefile.php'...


Пример с include
include 'somefile.php'; // Если файла нет, скрипт выдаст предупреждение, но продолжит выполняться
echo "Этот код выполнится";


Результат (если файла somefile.php нет):
Warning: include(somefile.php): failed to open stream...
Этот код выполнится


🟠Использование и рекомендации
require используют, когда файл обязателен для работы скрипта (например, файл с настройками или важными функциями).
include используют, когда файл необязателен, и его отсутствие не должно прерывать выполнение (например, дополнительный шаблон страницы).

🟠`require_once` и `include_once`
Дополнительно существуют require_once и include_once, которые работают аналогично, но не подключают файл повторно, если он уже был подключён.
require_once 'config.php'; // Подключится только один раз, даже если вызвано несколько раз


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое HTTP?

HTTP (HyperText Transfer Protocol) — это протокол передачи гипертекста, используемый для обмена данными между веб-браузером и сервером. HTTP определяет методы (GET, POST, DELETE и др.), которые управляют отправкой и получением данных через Интернет.?

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Имеет ли значение регистр заголовка?

Значение регистра заголовков может варьироваться в зависимости от конкретного контекста или системы разметки, в которой используются заголовки. Рассмотрим несколько примеров, чтобы понять, как различные системы относятся к регистру заголовков.

🚩HTML

Регистр заголовков не имеет значения. Теги HTML не чувствительны к регистру, поэтому <H1>Заголовок</H1> и <h1>Заголовок</h1> будут интерпретироваться одинаково.
<h1>Заголовок</h1>
<H1>Заголовок</H1>


🚩Markdown

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


🚩LaTeX

Регистр заголовков тоже не имеет значения с точки зрения разметки, но стандартной практикой является использование заглавных букв в начале каждого важного слова для улучшения читаемости.
\section{Заголовок}
\section{заголовок}


🚩Wiki-разметка (например, MediaWiki)

Регистр заголовков не влияет на разметку, но для консистентности и лучшей читаемости заголовки часто оформляют с заглавными буквами
= Заголовок =
= заголовок =


🚩Языки программирования

Как таковые не используются, но комментарии-заголовки могут быть оформлены по-разному. Регистр здесь также не имеет значения для компилятора или интерпретатора, но для людей, читающих код, использование заглавных букв может сделать заголовки более заметными
# ЗАГОЛОВОК УРОВНЯ 1
# заголовок уровня 1


Оба варианта являются допустимыми комментариями
// ЗАГОЛОВОК УРОВНЯ 1
// заголовок уровня 1


Ставь 👍 и забирай 📚 Базу знаний
🤔 Чем класс отличается от объекта?

1. Класс — это шаблон или "чертёж", описывающий свойства и поведение объектов.
2. Объект — это экземпляр класса, созданный с использованием его структуры.
3. Класс определяет, что объект может делать, а объект выполняет это поведение.
4. Класс — это абстракция, объект — конкретное воплощение.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое автоматическая загрузка классов?

Автоматическая загрузка классов (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


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

🟠Кэширование
Введены более сложные механизмы кэширования с использованием заголовков 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. Шардирование данных – разделение больших таблиц на более мелкие логические части.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое составной индекс?

Составной индекс (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.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое 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, памяти, дискового пространства помогают поддерживать высокую производительность и доступность серверов.
Безопасность: Метрики инцидентов безопасности, обнаружения уязвимостей и реагирования на угрозы помогают обеспечивать защиту данных и систем.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое ACID?

ACID — это акроним, обозначающий четыре ключевых свойства транзакций в базах данных: Atomicity (атомарность), Consistency (согласованность), Isolation (изоляция), Durability (устойчивость). Эти свойства гарантируют надежное выполнение транзакций.?

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое агрегат?

Агрегат – это термин, часто используемый в области баз данных и программирования, который обозначает способ группировки данных для выполнения различных операций, таких как суммирование, подсчёт, нахождение среднего значения и другие. В реляционных базах данных агрегаты применяются для выполнения агрегатных функций, таких как 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⃣Создание интерфейсов и реализаций зависимостей
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)
// Дублирование кода для расчёта скидки
$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;
}


Ставь 👍 и забирай 📚 Базу знаний