Методы в интерфейсах группируются по роли или контракту, то есть:
- Каждый интерфейс должен описывать конкретное поведение (например, Serializable, Renderable).
- Принцип разделения интерфейса (Interface Segregation Principle, SOLID) — лучше несколько небольших интерфейсов, чем один громоздкий.
- Интерфейс отражает намерение: что объект умеет делать, а не как он это делает.
Это упрощает поддержку, повторное использование и тестирование кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Полиморфизм — это одна из ключевых концепций ООП (объектно-ориентированного программирования), которая позволяет объектам разного типа использовать один и тот же интерфейс. Это значит, что один метод может работать с разными типами данных, но при этом давать корректный результат.
можно легко заменять одни классы другими, не меняя общий код.
код становится понятнее и легче для расширения.
один общий интерфейс может использоваться разными классами.
Полиморфизм через наследование (override, переопределение методов)
Полиморфизм через интерфейсы (реализация одного интерфейса разными классами)
Допустим, у нас есть базовый класс
Animal, у которого есть метод makeSound(). Разные животные будут издавать разные звуки, но все они будут использовать этот метод. class Animal {
public function makeSound() {
return "Some sound";
}
}
class Dog extends Animal {
public function makeSound() {
return "Woof!";
}
}
class Cat extends Animal {
public function makeSound() {
return "Meow!";
}
}
function printSound(Animal $animal) {
echo $animal->makeSound() . PHP_EOL;
}
printSound(new Dog()); // Выведет "Woof!"
printSound(new Cat()); // Выведет "Meow!"Иногда классы не связаны через наследование, но должны поддерживать общий метод. Для этого используется интерфейс:
interface Shape {
public function getArea(): float;
}
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function getArea(): float {
return pi() * $this->radius * $this->radius;
}
}
class Rectangle implements Shape {
private $width, $height;
public function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
}
public function getArea(): float {
return $this->width * $this->height;
}
}
function printArea(Shape $shape) {
echo "Площадь: " . $shape->getArea() . PHP_EOL;
}
printArea(new Circle(5)); // Выведет площадь круга
printArea(new Rectangle(4, 6)); // Выведет площадь прямоугольникаСтавь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Уровни изоляции в системах управления базами данных (СУБД) определяют, как операции транзакций видят и взаимодействуют с изменениями, внесенными другими параллельно выполняющимися транзакциями. Эти уровни изоляции помогают контролировать различные виды аномалий, таких как грязное чтение, неповторяющееся чтение и фантомные чтения. В стандарте SQL существует четыре основных уровня изоляции:
Этот уровень изоляции позволяет транзакциям видеть изменения других транзакций, даже если эти изменения еще не зафиксированы. Наименее строгий уровень изоляции, с наибольшей вероятностью возникновения аномалий.
Аномалии: Грязное чтение (Dirty Read): Транзакция может прочитать данные, которые были изменены другой транзакцией, но еще не зафиксированы.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Транзакция может видеть только те изменения, которые были зафиксированы другими транзакциями. Средний уровень изоляции, который предотвращает грязные чтения, но допускает другие аномалии.
Аномалии: Неповторяющееся чтение (Non-repeatable Read): Транзакция может дважды прочитать одно и то же значение и получить разные результаты, если другая транзакция изменила данные и зафиксировала изменения между двумя чтениями.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Транзакция гарантирует, что если она читает данные, они останутся неизменными до завершения транзакции. Более строгий уровень изоляции, который предотвращает грязные и неповторяющиеся чтения, но не предотвращает фантомные чтения.
Аномалии: Фантомное чтение (Phantom Read): Транзакция может получить разные результаты при выполнении одного и того же запроса, если другая транзакция добавляет или удаляет строки, которые соответствуют условиям запроса.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Самый строгий уровень изоляции, который эмулирует последовательное выполнение транзакций. Полностью предотвращает грязные чтения, неповторяющиеся чтения и фантомные чтения.
Аномалии: Никаких аномалий. Все транзакции выполняются так, как если бы они были выполнены последовательно.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
• Low Coupling (низкая связанность): уменьшение зависимости между модулями, чтобы изменения в одном модуле минимально затрагивали другие.
• High Cohesion (высокая связность): логически связанные функции и данные группируются в одном модуле, делая его функционально независимым.
Совмещение этих принципов упрощает сопровождение и тестирование кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это специализированный тип индекса, используемый для эффективного поиска текста в больших текстовых полях. Он позволяет быстро находить строки, содержащие определённые слова или фразы, в отличие от стандартных индексов, которые работают с точными совпадениями.
Полнотекстовый индекс предназначен для поиска и обработки текстовой информации, особенно в больших текстовых данных. Это необходимо, когда требуется:
Искать слова или фразы внутри длинных текстовых полей.
Находить записи, которые соответствуют похожим по смыслу запросам, а не только точным совпадениям.
Обеспечивать более быстрый и релевантный поиск по сравнению с простым перебором данных.
Когда создаётся полнотекстовый индекс, база данных анализирует текстовые данные, разбивает их на слова (токены) и сохраняет их в особой структуре индекса.
При выполнении запроса база данных ищет совпадения среди токенов в индексе, а не в самом тексте.
Полнотекстовый индекс учитывает частоту появления слов и их позицию, чтобы выдавать результаты, наиболее соответствующие запросу.
Полнотекстовый индекс можно создавать для столбцов типа
CHAR, VARCHAR, или TEXT. CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
noscript VARCHAR(255),
content TEXT,
FULLTEXT(noscript, content)
);
Для выполнения полнотекстового поиска используется оператор
MATCH ... AGAINST.SELECT *
FROM articles
WHERE MATCH(noscript, content) AGAINST('PHP tutorial');
Natural Language Mode: Поиск слов и фраз с учётом их важности.
Boolean Mode: Позволяет использовать логические операторы (например,
+ для обязательных слов, - для исключаемых).Query Expansion: Автоматически расширяет запрос с помощью синонимов или связанных слов.
SELECT *
FROM articles
WHERE MATCH(noscript, content) AGAINST('+PHP -Java' IN BOOLEAN MODE);
По умолчанию слова короче 3 символов игнорируются (это настраивается).
Некоторые часто встречающиеся слова (например, "and", "the") исключаются из индексации.
Важно учитывать настройки языка для анализа текста.
Полнотекстовые индексы доступны только для текстовых полей.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
1. Они защищают от SQL-инъекций, так как параметры передаются отдельно от запроса.
2. Улучшают производительность, так как один запрос можно выполнить несколько раз с разными данными.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Enterprise Service Bus (ESB) – это промежуточное программное обеспечение (middleware), которое объединяет разные системы и управляет их взаимодействием.
Допустим, у нас есть 4 системы:
CRM (Клиенты)
ERP (Бухгалтерия)
Склад
Интернет-магазин
Без ESB каждая система должна напрямую связываться со всеми остальными
CRM ↔️ ERP
CRM ↔️ Склад
CRM ↔️ Интернет-магазин
ERP ↔️ Склад
ERP ↔️ Интернет-магазин
Склад ↔️ Интернет-магазин
ESB действует как единый центр интеграции
CRM → ESB → ERP
Склад → ESB → Интернет-магазин
ERP → ESB → CRM
ESB использует 4 ключевых компонента
Маршрутизация (Routing) – определяет, куда отправлять данные.
Трансформация данных (Transformation) – конвертирует данные (например, из XML в JSON).
Безопасность (Security) – контролирует доступ.
Очереди сообщений (Message Queue) – управляет очередями и асинхронными задачами.
CRM отправляет заказ в формате JSON → ESB принимает его.
ESB конвертирует JSON в XML, понятный ERP.
ESB отправляет данные в ERP и склад.
Если склад временно недоступен, ESB ставит запрос в очередь и отправляет позже.
Крупные компании с множеством сервисов (банки, ритейл, логистика).
Интеграция старых и новых систем (например, SAP + микросервисы).
Высоконагруженные системы, где важна отказоустойчивость.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
• Он автоматически создаёт объекты и предоставляет их другим компонентам, решая, какие зависимости инъектировать.
• Контейнер упрощает реализацию DI, улучшает модульность и тестируемость приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это последовательности операций с базой данных, которые рассматриваются как единое целое. Они обеспечивают целостность данных, гарантируя, что либо все операции в транзакции выполнены успешно, либо никакие изменения не будут применены, если произошла ошибка.
Гарантирует, что все операции в рамках транзакции будут выполнены полностью или не будут выполнены вовсе. Если любая из операций внутри транзакции не удалась, все изменения откатываются.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
Обеспечивает перевод базы данных из одного согласованного состояния в другое. Транзакции должны оставлять базу данных в корректном состоянии, удовлетворяющем всем правилам и ограничениям.
Обеспечивает изолированность транзакций друг от друга. Это означает, что результаты промежуточных операций одной транзакции невидимы для других транзакций до завершения первой транзакции.
Гарантирует, что изменения, внесённые успешно завершённой транзакцией, будут сохранены в базе данных даже в случае сбоя системы.
Необходимо убедиться, что обе операции (списание и зачисление) выполнены успешно, чтобы избежать ситуации, когда деньги списаны, но не зачислены.
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. Родительский класс или интерфейс может быть заменён его наследником, сохраняя единообразие вызовов.
3. Пример: использование одного метода render() для вывода разного контента в зависимости от конкретного класса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это специальный инструмент или объект в программировании, который управляет созданием и внедрением зависимостей в объекты. Этот контейнер автоматически решает, какие зависимости требуются объекту, и предоставляет их при создании объекта, тем самым упрощая управление зависимостями в приложении.
DI-контейнер автоматически создает и внедряет зависимости, избавляя от необходимости вручную передавать их в объекты.
Позволяет легко заменять реализации зависимостей, не изменяя код, который их использует.
Обеспечивает легкую замену зависимостей на моки или заглушки для тестирования.
Разделяет создание объектов и их использование, способствуя более чистой архитектуре.
DI-контейнеры предоставляют различные методы для регистрации зависимостей и их последующего получения. Ниже приведен пример реализации простого DI-контейнера.
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";
}
}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;
}
}$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-контейнера.
В некоторых случаях может снижать производительность из-за необходимости разрешения зависимостей.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM