PHP | Вопросы собесов – Telegram
PHP | Вопросы собесов
2.43K subscribers
30 photos
1.1K links
Download Telegram
🤔 Что есть иммутабельный объект?

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

🚩Плюсы

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

Простота понимания и отладки
Так как состояние иммутабельного объекта не изменяется, код, использующий такие объекты, становится более предсказуемым и легче в отладке.

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

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

# Строки являются иммутабельными
s = "hello"
# Любая операция, изменяющая строку, создает новую строку
s = s.upper()
print(s) # Выведет "HELLO"

# Кортежи также являются иммутабельными
t = (1, 2, 3)
# Попытка изменить элемент кортежа вызовет ошибку
# t[0] = 0 # TypeError: 'tuple' object does not support item assignment


Класс String является иммутабельным. Всякий раз, когда выполняется операция, изменяющая строку, создается новый объект строки.
String s = "hello";
s = s.toUpperCase();
System.out.println(s); // Выведет "HELLO"


🚩Для создания своих иммутабельных классов в Java можно сделать следующее

Сделать класс финальным, чтобы предотвратить наследование.
Все поля объявить приватными и финальными.
Не предоставлять методов для изменения состояния (сеттеров).
Обеспечить, чтобы изменяемые объекты, передаваемые в конструктор, были скопированы.
public final class ImmutablePerson {
private final String name;
private final int age;

public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}
}


🚩Для создания иммутабельных объектов необходимо соблюдать несколько правил:

🟠Приватные и финальные поля
Все поля объекта должны быть объявлены как private и final.

🟠Отсутствие сеттеров
Не должны быть предоставлены методы, которые позволяют изменять состояние объекта.

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

🟠Защита изменяемых объектов
Если объект содержит изменяемые поля, такие как массивы или коллекции, они должны быть скопированы или защищены от изменения извне.

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

1. Динамическое программирование — это метод оптимизации, используемый для решения задач, разбиваемых на подзадачи.
2. Результаты подзадач сохраняются и переиспользуются, чтобы избежать повторных вычислений.
3. Используется для задач оптимизации, например, нахождение кратчайшего пути, задачи Фибоначчи или задач на разбиение.


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

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

🚩this

Используется для обращения к текущему объекту класса. Он позволяет получить доступ к нестатическим свойствам и методам объекта. Является ссылкой на вызываемый объект и используется внутри методов объекта для обращения к его свойствам и методам.
class Car {
public $color = 'red';

public function getColor() {
return $this->color; // Используется $this для доступа к свойству текущего объекта
}
}

$myCar = new Car();
echo $myCar->getColor(); // Выведет 'red'


🚩self

Используется для обращения к текущему классу и применяется в основном для доступа к статическим свойствам и методам класса. Ссылается на класс, в котором она была вызвана, и не требует создания экземпляра объекта для доступа к содержимому.
class Car {
public static $count = 0;

public function __construct() {
self::$count++; // Используется self для доступа к статическому свойству
}

public static function getTotalCars() {
return self::$count; // Обращение к статическому методу или свойству
}
}

$newCar1 = new Car();
$newCar2 = new Car();
echo Car::getTotalCars(); // Выведет '2'


🚩Основные различия

🟠Контекст использования
$this используется для доступа к свойствам и методам текущего объекта экземпляра, тогда как self используется для доступа к статическим свойствам и методам класса.
🟠Статический vs Нестатический
$this нельзя использовать в статических методах, потому что статические методы могут быть вызваны без создания объекта класса. self, напротив, предназначена для использования в статическом контексте.
🟠Привязка
self привязана к классу, в котором она написана, а $this — к объекту, через который вызывается метод.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что делать, если у двух trait'ов один и тот же метод?

1. Если два trait содержат методы с одинаковыми именами, необходимо явно указать, какой метод использовать, с помощью use TraitName::methodName.
2. В сложных случаях можно переопределить метод в классе для явной реализации.


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

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

🚩Зачем нужно абстрагирование

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

🟠Повышение читаемости кода
Упрощает код, делая его более читаемым и легким для поддержки.

🟠Повторное использование кода
Создаёт возможность повторного использования общих функций и логики.

🟠Инкапсуляция
Позволяет скрывать реализацию и представлять только необходимые интерфейсы для взаимодействия.

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

🚩Как используется абстрагирование

Абстрагирование в программировании часто реализуется через классы и интерфейсы. Ниже приведены примеры абстракции в объектно-ориентированном программировании (ООП).

🚩Пример абстракции с использованием классов и интерфейсов

🟠Интерфейс
Определяет набор методов, которые должны быть реализованы, не указывая, как именно они должны быть реализованы.
interface Shape {
public function draw();
}


🟠Классы, реализующие интерфейс
Реализуют методы, определённые в интерфейсе.
class Circle implements Shape {
public function draw() {
echo "Drawing a circle";
}
}

class Square implements Shape {
public function draw() {
echo "Drawing a square";
}
}


Использование абстракции
function renderShape(Shape $shape) {
$shape->draw();
}

$circle = new Circle();
$square = new Square();

renderShape($circle); // Вывод: Drawing a circle
renderShape($square); // Вывод: Drawing a square


🚩Плюсы и минусы

Снижение сложности
Абстракция скрывает сложные детали реализации, облегчая работу с системой.
Улучшение читаемости
Код становится более понятным и структурированным.
Гибкость и расширяемость
Облегчает добавление новых функций и изменений.
Повторное использование
Позволяет использовать общий код в разных частях программы.
Избыточность
Иногда может приводить к избыточной сложности, если абстракции слишком сложные или используются неправильно.
Накладные расходы
Может потребоваться больше времени и усилий на создание абстракций и их поддержку.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чём суть абстрактного класса?

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

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

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

🚩Service-Oriented Architecture (SOA) – Сервисно-ориентированная архитектура

- Это переходный вариант между монолитом и микросервисами.
- В SOA приложение делится на крупные сервисы (например, "Платежи", "Пользователи", "Заказы").
- Все сервисы взаимодействуют через ESB (Enterprise Service Bus) – специальный слой для связи между сервисами.
Для крупных корпоративных систем, где много интеграций.
Когда нужна централизованная логика взаимодействия сервисов.

🚩Serverless (Бессерверная архитектура)

- Код выполняется в облаке, а не на собственных серверах.
- Программист пишет функции (FaaS – Function as a Service), которые выполняются по запросу.
- Серверы управляются автоматически (AWS Lambda, Google Cloud Functions).
Когда нужно автоматическое масштабирование (например, обработка миллионов событий).
Для маленьких ивентовых задач (обработка файлов, уведомления, API-эндпоинты).

🚩Event-Driven Architecture (EDA) – Событийно-ориентированная архитектура

- Компоненты системы не вызывают друг друга напрямую, а общаются через события.
- Используется*message broker (Kafka, RabbitMQ, Redis Pub/Sub) для передачи данных.
В нагруженных системах, где много событий (банковские системы, биржи).
Когда нужна гибкость и асинхронность.

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

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

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

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

🚩Принципы выбор

🟠Требования к проекту
Функциональные требования: Какие функции должно выполнять приложение?
Нефункциональные требования: Производительность, масштабируемость, надежность, безопасность и т.д.

🟠Объем и сложность проекта
Размер команды: Количество разработчиков, их опыт и навыки.
Сложность бизнес-логики: Насколько сложны процессы и операции, которые будет выполнять система.

🟠Масштабируемость и производительность
Нагрузка: Ожидаемое количество пользователей, объем данных и частота операций.
Горизонтальная и вертикальная масштабируемость: Возможность добавления новых серверов или улучшения существующих для обработки увеличивающейся нагрузки.

🟠Надежность и отказоустойчивость
Требования к доступности: Время безотказной работы и допустимые уровни простоя.
Механизмы резервирования и восстановления: Способы обеспечения бесперебойной работы при сбоях.

🟠Безопасность
Конфиденциальность данных: Как будет обеспечиваться защита данных от несанкционированного доступа.
Целостность данных: Меры для предотвращения и обнаружения изменений данных.

🟠Управляемость и поддержка
Обслуживаемость: Легкость управления, мониторинга и обновления системы.
Документирование: Наличие подробной документации для поддержки и развития.

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

🟠Стоимость и сроки
Бюджет: Стоимость разработки, развертывания и поддержки системы.
Временные ограничения: Сроки выполнения проекта и время на разработку.

🚩Примеры выбора

🟠Monolithic Architecture (Монолитная архитектура)
Небольшие или средние проекты с низкой сложностью.
Ограниченные требования к масштабируемости.
Ограниченные ресурсы и сроки разработки.
Простое веб-приложение для управления контентом (CMS), где все компоненты (база данных, интерфейс пользователя, логика приложения) развернуты на одном сервере.

🟠Microservices Architecture (Микросервисная архитектура)
Большие и сложные проекты с высокой нагрузкой.
Требуется высокая масштабируемость и отказоустойчивость.
Разделение разработки на независимые команды.
Электронная коммерция, где отдельные микросервисы управляют различными аспектами системы, такими как управление продуктами, корзина, платежи, учетные записи пользователей и т.д.

🟠Event-Driven Architecture (Событийно-ориентированная архитектура)
Системы, которые должны реагировать на события в реальном времени.
Высокая гибкость и адаптивность к изменяющимся условиям.
Финансовая торговая платформа, где события от биржи передаются и обрабатываются различными сервисами в реальном времени для выполнения сделок и анализа данных.

🟠Serverless Architecture (Безсерверная архитектура)
Приложения с переменной нагрузкой.
Минимизация операционных расходов и управление серверной инфраструктурой.

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

Это запись событий, ошибок и действий приложения в журнал для диагностики и анализа.
1. Логи помогают отслеживать выполнение кода, анализировать сбои и выявлять узкие места.
2. Используются различные уровни логов: INFO, DEBUG, ERROR.
3. Это важный инструмент для отладки, мониторинга и аудита системы.


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

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

🚩Основные способы передачи данных в PHP

🟠Передача данных через `GET` (в URL)
Когда использовать: когда данные не секретные и нужно поделиться ссылкой.
// URL: example.com/page.php?name=Alice&age=25
echo $_GET['name']; // Alice
echo $_GET['age']; // 25


🟠Передача данных через `POST` (скрыто, чаще через формы)
Когда использовать: если данные конфиденциальные или большие (файлы, формы).
if ($_SERVER["REQUEST_METHOD"] === "POST") {
echo $_POST['username'];
}


🟠Передача данных через `SESSION` (сохраняются между страницами)
Когда использовать: если нужно запомнить данные пользователя между запросами.
session_start();
$_SESSION['user'] = "Alice"; // Сохраняем данные

echo $_SESSION['user']; // Alice


🟠Передача данных через `COOKIE` (сохраняются в браузере)
Когда использовать: если данные должны храниться даже после закрытия браузера.
setcookie("user", "Alice", time() + 3600); // Кука на 1 час
echo $_COOKIE['user']; // Alice


🟠Передача данных в API (JSON, `php://input`)
Когда использовать: если PHP получает данные от другого сервиса (например, мобильного приложения или JavaScript).
$data = json_decode(file_get_contents("php://input"), true);
echo $data['name'];


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊1
🤔 Какую проблему решают фабрика и фабричный метод?

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

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

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

🚩Основные отличия

🟠Надежность
TCP: Обеспечивает надежную передачу данных. Он использует механизмы установления соединения, подтверждение получения (ACK), контроль потерь пакетов, повторную передачу потерянных пакетов и контроль потока. Это гарантирует, что данные будут доставлены корректно и в правильном порядке.
UDP: Не обеспечивает надежную передачу данных. Нет подтверждений получения, нет повторной передачи потерянных пакетов и нет контроля потока. Это делает передачу менее надежной, но более быстрой и с меньшими накладными расходами.

🟠Установление соединения
TCP: Перед началом передачи данных устанавливается соединение с помощью процедуры "трехстороннего рукопожатия" (three-way handshake). Это означает, что обе стороны сначала обмениваются сигналами SYN и ACK для установления соединения.
UDP: Не требует установления соединения. Пакеты (датаграммы) просто отправляются к получателю без предварительного установления соединения.

🟠Порядок доставки
TCP: Обеспечивает доставку данных в правильном порядке. Если пакеты приходят в неправильном порядке, TCP собирает их в правильном порядке перед передачей приложению.
UDP: Не гарантирует порядок доставки. Пакеты могут приходить в произвольном порядке, и приложение должно обрабатывать их соответствующим образом, если это необходимо.

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

🟠Применение
TCP: Используется для приложений, где важна надежность и порядок передачи данных, таких как веб-браузеры (HTTP/HTTPS), электронная почта (SMTP, IMAP, POP3), файловые передачи (FTP), удаленный доступ (SSH).
UDP: Используется для приложений, где важна скорость и где потеря некоторых пакетов не критична, таких как потоковое видео и аудио (VoIP, IPTV), онлайн-игры, службы доменных имен (DNS).

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

TCP
HTTP/HTTPS: Веб-серфинг
SMTP: Отправка электронной почты
IMAP/POP3: Получение электронной почты
FTP: Передача файлов
SSH: Безопасный удаленный доступ


UDP
DNS: Запросы доменных имен
VoIP: Передача голоса через IP
IPTV: Потоковое видео
Онлайн-игры: Быстрая передача данных игровой логики
NTP: Синхронизация времени


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем отличие адаптера от декоратора

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

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

Хеш-таблица – это структура данных, которая хранит пары "ключ → значение" и использует хеш-функцию для быстрого поиска, добавления и удаления данных.

🚩Основная идея

Ключ обрабатывается хеш-функцией → превращается в числовой индекс.
По индексу данные хранятся в массиве.
Быстрое обращение к данным по ключу: O(1) в среднем.

🚩Как это работает?

🟠Хеширование ключа
Представим, что у нас есть ключ "apple", и мы храним для него значение 100.
Применяем хеш-функцию к "apple"
$hash = hash('md5', 'apple'); 
echo $hash; // 1f3870be274f6c49b3e31a0c6728957f


Это хеш – длинное число, но нам нужно индексировать данные, поэтому мы берем его остаток от деления на размер массива (mod):
$index = hexdec(substr($hash, 0, 8)) % 10; 
echo $index; // Например, 3


🟠Поиск элемента
Когда мы ищем apple, алгоритм:
Применяет ту же хеш-функцию, получает индекс 3
Ищет значение в ячейке 3
Таким образом, поиск данных по ключу происходит мгновенно – O(1).
Коллизия – это когда разные ключи дают один и тот же индекс.
Пример: "apple" и "banana" могут попасть в одну ячейку!
Решения:
Метод цепочек – внутри каждой ячейки храним список значений (например, массив или связанный список).
Открытая адресация – если ячейка занята, ищем следующую свободную.

🚩Хеш-таблица в PHP

В PHP массивы (array) работают как хеш-таблицы!
$hashTable = [];
$hashTable['apple'] = 100;
$hashTable['banana'] = 200;

echo $hashTable['apple']; // 100


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

Динамическая типизация позволяет переменной менять тип во время выполнения программы. Тип определяется автоматически на основе присвоенного значения.


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

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

🚩Зачем нужно абстрагирование

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

🟠Повышение читаемости кода
Упрощает код, делая его более читаемым и легким для поддержки.

🟠Повторное использование кода
Создаёт возможность повторного использования общих функций и логики.

🟠Инкапсуляция
Позволяет скрывать реализацию и представлять только необходимые интерфейсы для взаимодействия.

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

🚩Как используется абстрагирование

Абстрагирование в программировании часто реализуется через классы и интерфейсы. Ниже приведены примеры абстракции в объектно-ориентированном программировании (ООП).

🚩Пример абстракции с использованием классов и интерфейсов

🟠Интерфейс
Определяет набор методов, которые должны быть реализованы, не указывая, как именно они должны быть реализованы.
interface Shape {
public function draw();
}


🟠Классы, реализующие интерфейс
Реализуют методы, определённые в интерфейсе.
class Circle implements Shape {
public function draw() {
echo "Drawing a circle";
}
}

class Square implements Shape {
public function draw() {
echo "Drawing a square";
}
}


Использование абстракции
function renderShape(Shape $shape) {
$shape->draw();
}

$circle = new Circle();
$square = new Square();

renderShape($circle); // Вывод: Drawing a circle
renderShape($square); // Вывод: Drawing a square


🚩Плюсы и минусы

Снижение сложности
Абстракция скрывает сложные детали реализации, облегчая работу с системой.
Улучшение читаемости
Код становится более понятным и структурированным.
Гибкость и расширяемость
Облегчает добавление новых функций и изменений.
Повторное использование
Позволяет использовать общий код в разных частях программы.
Избыточность
Иногда может приводить к избыточной сложности, если абстракции слишком сложные или используются неправильно.
Накладные расходы
Может потребоваться больше времени и усилий на создание абстракций и их поддержку.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Зачем нужно ключевое слово final?

Ключевое слово final в PHP используется для того, чтобы запретить наследование классов или переопределение методов в дочерних классах. Это помогает защитить важные части кода от изменения и сохранять логику в неприкосновенности. Final используется для обеспечения предсказуемости поведения в классах.

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

Бинарное дерево – это структура данных, где каждый узел имеет максимум 2 потомка:
Левый потомок содержит меньшие значения.
Правый потомок содержит большие значения.

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

Каждый узел состоит из:
Значения (value) – данные в узле.
Ссылки на левый (left) и правый (right) потомки (или null, если потомка нет).

       8
/ \
3 10
/ \ \
1 6 14
/ \ /
4 7 13



🚩Основные операции с бинарным деревом

🟠Вставка нового элемента
Если дерево пустое → создаём корневой узел.
Сравниваем значение с корнем:
- Если меньше → идём налево.
- Если больше → идём направо.
Повторяем, пока не найдём свободное место.
       8
/ \
3 10
/ \
1 6
/ \
4 7
/
5 <-- новый элемент добавляется слева от 6


Код вставки в PHP
class Node {
public int $value;
public ?Node $left = null;
public ?Node $right = null;

public function __construct(int $value) {
$this->value = $value;
}
}

class BinaryTree {
public ?Node $root = null;

public function insert(int $value) {
$this->root = $this->insertRec($this->root, $value);
}

private function insertRec(?Node $node, int $value): Node {
if ($node === null) return new Node($value);
if ($value < $node->value) $node->left = $this->insertRec($node->left, $value);
else $node->right = $this->insertRec($node->right, $value);
return $node;
}
}

$tree = new BinaryTree();
$tree->insert(8);
$tree->insert(3);
$tree->insert(10);
$tree->insert(6);
$tree->insert(14);


🟠Поиск элемента в дереве
Алгоритм:
Начинаем с корня.
Если value == корень → найдено.
Если value < корень → ищем влево.
Если value > корень → ищем вправо.

1. 6 < 8 → идём влево к 3.
2. 6 > 3 → идём вправо к 6.
3. Нашли!

public function search(?Node $node, int $value): ?Node {
if ($node === null || $node->value === $value) return $node;
return ($value < $node->value)
? $this->search($node->left, $value)
: $this->search($node->right, $value);
}

$foundNode = $tree->search($tree->root, 6);
echo $foundNode ? "Найдено: " . $foundNode->value : "Не найдено";


🟠Удаление элемента из дерева
Сложность:
1. Если узел – лист → просто удаляем.
2. Если у узла один потомок → заменяем его потомком.
3. Если два потомка → находим минимальный элемент в правом поддереве и заменяем им удаляемый узел.

Пример удаления 3 (у него есть два потомка 1 и 6):
1. Находим минимальный узел в правом поддереве → 4.
2. Заменяем 3 на 4.
       8
/ \
3 10
/ \
1 6
/ \
4 7


После удаления 3
       8
/ \
4 10
/ \
1 6
/ \
5 7


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

Динамическая типизация характерна для языков, таких как Python, JavaScript, PHP. Например, переменная может быть сначала числом, а затем строкой.


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

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

🚩Анонимные функции

Это функции без имени, которые часто используются для создания функций-замыканий. Замыкания позволяют функциям захватывать переменные из своей области видимости. Анонимные функции создаются с использованием ключевого слова function.
<?php
$sayHello = function($name) {
return "Привет, $name!";
};

echo $sayHello("Мир"); // Выведет: Привет, Мир!
?>


🚩Стрелочные функции

Были введены в PHP 7.4 и представляют собой более компактный способ создания анонимных функций. Они используют синтаксис fn и автоматически захватывают переменные из внешней области видимости по значению.
<?php
$factor = 10;

$multiply = fn($x) => $x * $factor;

echo $multiply(5); // Выведет: 50
?>


🚩Зачем это нужно?

🟠Удобство
Создание функций на месте без необходимости придумывать имена.
🟠Замыкания
Возможность захвата переменных из внешней области видимости.
🟠Читабельность кода
Стрелочные функции делают код более лаконичным и читаемым.

🚩Как это используется?

🟠Фильтрация и сортировка массивов
Часто используются в функциях вроде array_filter, array_map и usort.
🟠Колбэки
Передача функции в качестве аргумента в другие функции (например, для обработки событий).

<?php
$numbers = [1, 2, 3, 4, 5];

$squared = array_map(fn($n) => $n * $n, $numbers);

print_r($squared); // Выведет: Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
?>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM