PHP Backend | YeaHub – Telegram
PHP Backend | YeaHub
402 subscribers
235 photos
10 videos
430 links
Теория, подготовка к интервью и курсы для PHP разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#ЛитКод
Задача: 437. Path Sum III

Дан корень бинарного дерева и целое число targetSum, вернуть количество путей, где сумма значений вдоль пути равна targetSum.

Путь не обязательно должен начинаться или заканчиваться в корне или на листе, но он должен идти вниз (т.е. перемещаться только от родительских узлов к дочерним).

Пример:
Input: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
Output: 3
Explanation: The paths that sum to 8 are shown.


👨‍💻 Алгоритм:

1⃣Инициализируем счетчик путей в дереве count = 0 и хеш-таблицу h, где ключ - это префиксная сумма, а значение - сколько раз она встречалась. Выполним рекурсивный обход дерева в порядке preorder: узел -> левый -> правый. Функция preorder(node: TreeNode, curr_sum: int) принимает два аргумента: узел дерева и префиксную сумму перед этим узлом. Чтобы запустить рекурсию, вызовем preorder(root, 0).

2⃣Сначала обновим текущую префиксную сумму, добавив значение текущего узла: curr_sum += node.val. Теперь можно обновить счетчик. Рассмотрим две ситуации. В первой ситуации путь в дереве с целевой суммой начинается с корня. Это означает, что текущая префиксная сумма равна целевой сумме curr_sum == k, поэтому увеличиваем счетчик на 1: count += 1. Во второй ситуации путь с целевой суммой начинается где-то ниже. Это означает, что нужно добавить к счетчику количество раз, когда мы видели префиксную сумму curr_sum - target: count += h[curr_sum - target].

3⃣Логика проста: текущая префиксная сумма - это curr_sum, а несколько элементов назад префиксная сумма была curr_sum - target. Все элементы между ними суммируются до curr_sum - (curr_sum - target) = target. Теперь обновим хеш-таблицу: h[curr_sum] += 1. Проанализируем левое и правое поддеревья: preorder(node.left, curr_sum), preorder(node.right, curr_sum). После обработки текущего поддерева удалим текущую префиксную сумму из хеш-таблицы, чтобы не смешивать параллельные поддеревья: h[curr_sum] -= 1. Когда обход в порядке preorder завершен, счетчик обновлен. Вернем его.

😎 Решение:
class Solution {
function pathSum($root, $sum) {
$count = 0;
$k = $sum;
$h = [];

$preorder = function($node, $curr_sum) use (&$preorder, &$count, &$h, $k) {
if (!$node) return;
$curr_sum += $node->val;
if ($curr_sum == $k) {
$count++;
}
$count += $h[$curr_sum - $k] ?? 0;
$h[$curr_sum] = ($h[$curr_sum] ?? 0) + 1;
$preorder($node->left, $curr_sum);
$preorder($node->right, $curr_sum);
$h[$curr_sum]--;
};

$preorder($root, 0);
return $count;
}
}


👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
#статьи
😬 Как организовать структуру приложения

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

В этой статье разбирается, что значит «понятная структура кода», и почему её наличие столь важно для успешной разработки.
Читать статью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
2
#статьи
😊 Упакуйте свой код правильно

В предыдущей статье «Как организовать структуру приложения» рассматривались различные подходы к организации кода, включая монолитную архитектуру, многослойную архитектуру и принципы чистой архитектуры. Особое внимание уделялось важности понятной структуры кода, способствующей упрощению его понимания, внедрению новых функций и снижению вероятности ошибок. Были рассмотрены критерии понятности, такие как чёткое назначение файлов и папок, разделение логики по модулям или функциональным зонам, использование самодокументируемых названий и соблюдение стандартов кодирования. Также поднимались проблемы, возникающие при неструктурированной организации кода, включая сложность навигации, отсутствие модульности и нарушение принципов SOLID и GRASP.
Читать полностью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как РНР взаимодействует с базами данных?

PHP взаимодействует с базами данных через MySQLi, PDO или ORM. MySQLi подходит для работы только с MySQL, а PDO поддерживает разные базы данных. ORM (например, Eloquent) позволяет абстрагироваться от SQL-запросов, работая с объектами.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
😎 navi — утилита для командной строки

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

Как использовать

1⃣ Устанавливаем через Homebrew:
brew install navi

2⃣ Запускаем командой:
navi — доступ ко всем шпаргалкам

3⃣ Встраиваем как shell-виджет или tmux-виджет для быстрого доступа

4⃣ Создаем свои шпаргалки или импортируем из других источников (например, tldr или cheat.sh)


Что еще умеет

🟠 Поддерживает кастомные конфиги, цвета и пути для шпаргалок

🟠 Работает в любом терминале или через Tmux

🟠 Можно использовать как скриптовый инструмент или даже через Alfred
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 Как можно получить список маршрутов, зарегистрированных пакетами в ваших Laravel-приложениях?

Вы можете сделать это, выполнив команду:

php artisan route:list --only-vendor


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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Совет по PHP для массовой замены строк

Вы можете использовать str_replace(), передавая массивы ключей и значений в качестве параметров, без использования циклов.

Источник фрагмента кода: GitHub

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Каковы различия между MySQLi и PDO?

MySQLi - это расширение, предназначенное только для работы с MySQL, оно поддерживает процедурный и объектно-ориентированный стили программирования. PDO (PHP Data Objects) - универсальный инструмент для работы с разными базами данных (MySQL, PostgreSQL, SQLite и др.), который работает только в объектно- ориентированном стиле. PDO предоставляет унифицированный интерфейс и поддерживает именованные параметры в запросах, тогда как MySQLi лучше подходит для специфичных функций MySQL, например, хранимых процедур.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
😊 Автотесты | Как мокировать классы с помощью PHPUnit

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 PVM — менеджер версий PHP

Простой bash-скрипт для управления несколькими версиями PHP в Unix-системах(в том числе MacOS).

Установка через Curl:
curl -o /usr/local/bin/pvm https://raw.githubusercontent.com/smoqadam/pvm/main/pvm
chmod +x /usr/local/bin/pvm
export PATH="$HOME/.pvm/current:$PATH"
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤣 Одна из самых подробных и полезных шпаргалок для Backend-разработчиков на русском языке.

Всё, что нужно, собрано в одном месте: как устроен интернет, как работают ПК, базы данных, API, тестирование и куча всего ещё

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как управлять подключениями к базе данных в РНР?

В РНР подключение к базе данных осуществляется через MySQLi или PDO. Чтобы избежать утечек ресурсов, соединение нужно закрывать после выполнения операций. Для повышения безопасности следует использовать подготовленные запросы и обрабатывать ошибки через исключения.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
URL vs URI vs URN — в чем разница?


🟠 URI (Uniform Resource Identifier)
URI — это строка символов, идентифицирующая ресурс по местоположению, имени или обоим параметрам. Это самый общий идентификатор. URL и URN являются подтипами URI.

🟠 URL (Uniform Resource Locator)
URL — это подтип URI, который указывает, как найти ресурс в сети. Он включает протокол (например, HTTPS), домен и часто путь. URL полностью описывает способ доступа к ресурсу. Например: https://example.com/path/to/resource. URL также может использоваться с другими протоколами, такими как FTP.

🟠 URN (Uniform Resource Name)
URN — это тоже подтип URI, но он идентифицирует ресурс по имени в рамках определенного пространства имен, а не по местоположению. Он использует схему urn. URN не может быть использован для нахождения ресурса. Это глобально уникальный идентификатор, который остается неизменным независимо от местоположения ресурса. Например, urn:isbn:0361450721 идентифицирует книгу по ее ISBN, который остается неизменным, даже если книга хранится в разных местах.

Проще говоря:

🟠URL — это URI, но не всякий URI является URL.
🟠URN — уникальные имена, URL — локаторы, URI объединяет оба типа.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🫠 Поскольку в сериализуемом замыкании нельзя использовать $this, рассмотрите возможность вынесения колбэков Bus::batch, основанных на Closure, в отдельные вызываемые (callable) классы.

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Vito

Это самохостимое веб-приложение для управления серверами и деплоя PHP-приложений.

Поддерживает управление базами данных, настройку файрвола, установку SSL-сертификатов и управление cron-заданиями.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как выполнять транзакции в РНР с MySQL?

Транзакции позволяют выполнять несколько запросов к базе данных как единое целое. Если один из запросов завершится неудачей можно скатить изменения врнр транзакции реализуются через MySQLi или PDO, с использованием методов beginTransaction, commit n rollBack.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 HTTP/2 vs HTTP/3 — В чем разница?

HTTP/1 появился в 1996 году, а уже в 1997 вышел HTTP/1.1.

Следующий крупный шаг произошел только спустя ~20 лет — в 2015 году был стандартизирован HTTP/2. А в 2022 году официально утвердили HTTP/3.

В чем разница?

HTTP/1.1
Постоянные соединения — повторное использование соединений вместо открытия новых
Потоковая передача (Chunked Transfer) — отправка данных частями вместо ожидания полного ответа
Улучшенное кеширование — заголовки для управления кешем и соединениями
Последовательные запросы — блокируют друг друга (HoL-блокировка на уровне запросов)
Требуется несколько соединений — браузеры открывали несколько TCP-соединений для скорости

HTTP/1.1 заложил фундаментальные механизмы, актуальные и сегодня.

HTTP/2
Мультиплексирование — несколько запросов в одном TCP-соединении
Сжатие заголовков (HPACK) — уменьшение накладных расходов
Приоритизация потоков — критически важные ресурсы загружаются первыми
HoL-блокировка — потерянный пакет блокирует все потоки

HTTP/2 оптимизировал TCP, но остался ограничен его архитектурой.

HTTP/3
Основан на QUIC (UDP) — больше нет узких мест TCP
Независимые потоки — потеря пакетов в одном потоке не мешает другим
Быстрые рукопожатия — транспорт и шифрование настраиваются за один шаг
Обязательное шифрование (TLS 1.3) — безопасность по умолчанию
Миграция соединений — стабильная работа при смене сети

Вывод: HTTP/2 оптимизировал TCP, но HTTP/3 меняет правила игры с QUIC — быстрее, надежнее и безопаснее по умолчанию.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😬 При работе с загрузкой изображений в Laravel важно проверять их ширину и высоту.

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

Не проблема! Класс Rule в Laravel позволяет легко валидировать размеры изображения с понятным синтаксисом.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM