PHP Backend | YeaHub
224 subscribers
131 photos
7 videos
233 links
Теория, подготовка к интервью и курсы для PHP разработчиков

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

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

Для связи: @ruslan_kuyanets
Download Telegram
#полезное
👍 PHP 8.4 поставляется с удобным классом для работы с числами с плавающей запятой, который предлагает:

🟠максимальную точность
🟠объектно-ориентированный подход
🟠неизменяемые объекты
🟠удобные цепочные операции

Этот класс является частью расширения BCMath, которое обычно включено по умолчанию

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 TwigStan — статический анализатор для Twig'а

Это статический анализатор для шаблонов Twig, основанный на PHPStan. Он предназначен для выявления ошибок в шаблонах Twig на этапе разработки, что способствует повышению качества и надежности кода. Инструмент компилирует шаблоны Twig в PHP-код, оптимизирует его для лучшего анализа и сообщает об ошибках, указывая исходный шаблон и номер строки, где возникла проблема.
Гитхаб

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как РНР обрабатывает отчёты об ошибках?

PHP обрабатывает ошибки с помощью функции error_reporting() , которая задаёт уровень отчётности, и директивы display_errors , контролирующей вывод ошибок. Для логирования ошибок используется log_errors . Для кастомной обработки ошибок можно использовать функции set_error_handler() и set_exception_handler() . В производственной среде рекомендуется отключать вывод ошибок и включать логирование.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#вакансии
👨‍💻 Junior php-разработчик

Удаленно (Москва)

Motivity 
— это HR-tech сервис с готовой методологией.

Требования
🟠 Ты хорошо понимаешь ООП;
🟠 У тебя есть понимание и практика применения SOLID;
🟠 Хорошее знание PHP 8.1+;
🟠 Хорошее знание Symfony 5.4+ (Forms, Validator, Security, DI, EventDispatcher, Messenger, Console, Serrialization, Cache, Doctrine, Twig).
Подробнее о вакансии

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
😊 Быстрый совет по Laravel: Ограничение скорости выполнения задач

Когда-нибудь приходилось ограничивать частоту выполнения задач?

Будь то защита API от перегрузки или ограничение количества задач для пользователей бесплатного тарифа, Laravel позволяет легко задавать лимиты и использовать их прямо из коробки

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
🥺 Секреты стройности монолита: подходы по снятию нагрузки с БД

Статья описывает, как команда Яндекс Еды оптимизировала свой монолитный PHP-сервис, снизив нагрузку на MySQL

Основные проблемы включали высокую загрузку CPU и памяти, сложность управления изменениями в структуре базы данных и срабатывание механизма Flow Control в Galera Cluster, что приводило к задержкам и сбоям в обслуживании запросов.

Для решения этих проблем команда распределила ответственность за таблицы между командами, анализировала медленные запросы с помощью утилиты pt-query-digest и внедрила различные оптимизации, включая использование кэширования и денормализацию данных

В результате удалось значительно снизить нагрузку на базу данных и улучшить производительность системы
Читать статью

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как описать паттерн Наблюдатель (Observer) ?

Паттерн Наблюдатель - это поведенческий паттерн проектирования, в котором объект (субъект) уведомляет другие объекты (наблюдатели) о изменении своего состояния. Это полезно для реализации систем обработки событий. В РНР паттерн Наблюдатель может быть реализован с помощью интерфейсов SplObserver и SplSubject из стандартной библиотеки.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
😊 Общение с умными устройствами силами PHP

Каждый день мы сталкиваемся с более новыми и умными устройствами, управляемыми через интернет или Wi-Fi. Концепция IoT (Internet of Things) объединяет физические устройства в одну сеть для передачи данных и управления ими. И, оказывается, что интернет вещей — никакое не ограничение! Управлять устройствами в сети можно с помощью легковесного протокола MQTT.
Хабр

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЛитКод
Задача: 679. 24 Game

Дан массив целых чисел cards длиной 4. У вас есть четыре карты, каждая из которых содержит число в диапазоне от 1 до 9. Вам нужно расположить числа на этих картах в математическом выражении, используя операторы ['+', '-', '*', '/'] и скобки '(' и ')' так, чтобы получить значение 24.

Вы ограничены следующими правилами:

Оператор деления '/' представляет собой реальное деление, а не целочисленное деление.
Например, 4 / (1 - 2 / 3) = 4 / (1 / 3) = 12.
Каждая операция выполняется между двумя числами. В частности, мы не можем использовать '-' как унарный оператор.
Например, если cards = [1, 1, 1, 1], выражение "-1 - 1 - 1 - 1" не допускается.
Вы не можете объединять числа вместе.
Например, если cards = [1, 2, 1, 2], выражение "12 + 12" недопустимо.
Вернуть true, если вы можете получить такое выражение, которое оценивается в 24, и false в противном случае.

Пример:
Input: cards = [4,1,8,7]
Output: true
Explanation: (8-4) * (7-1) = 24


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

1⃣Создайте функцию generatePossibleResults(a, b), которая возвращает массив результатов всех возможных математических операций над двумя числами.

2⃣ Создайте функцию checkIfResultReached(list), чтобы проверить, можем ли мы достичь результата 24, используя текущий массив list. Сначала проверьте базовые условия: если размер массива равен 1, верните true, если результат равен 24, иначе верните false.

3⃣Если размер массива больше 1, выберите любые два числа из списка, выполните все математические операции над ними, создайте новый список с обновленными элементами и снова вызовите рекурсивную функцию с этим новым списком. Если ни одна комбинация не приводит к результату 24, верните false. Вызовите checkIfResultReached с исходным списком карт.

😎 Решение:
class Solution {
function generatePossibleResults($a, $b) {
$res = [$a + $b, $a - $b, $b - $a, $a * $b];
if ($a != 0) $res[] = $b / $a;
if ($b != 0) $res[] = $a / $b;
return $res;
}

function checkIfResultReached($list) {
if (count($list) == 1) return abs($list[0] - 24) <= 0.1;

for ($i = 0; $i < count($list); $i++) {
for ($j = $i + 1; $j < count($list); $j++) {
$newList = [];
for ($k = 0; $k < count($list); $k++) {
if ($k != $i && $k != $j) $newList[] = $list[$k];
}
foreach ($this->generatePossibleResults($list[$i], $list[$j]) as $res) {
$newList[] = $res;
if ($this->checkIfResultReached($newList)) return true;
array_pop($newList);
}
}
}
return false;
}

function judgePoint24($cards) {
return $this->checkIfResultReached(array_map('floatval', $cards));
}
}


👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Общие табличные выражения (CTE) в MySQL позволяют писать более чистые и удобные для поддержки запросы, создавая временные именованные наборы результатов.

Вместо вложенных подзапросов CTE можно использовать во многих случаях

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

RESTful API строится на основе НТТР-методов (GET, POST, PUT, DELETE) и позволяет управлять ресурсами с помощью URI. В PHP обработка запросов осуществляется через маршруты, где каждый маршрут привязан к определенному ресурсу и методу. Для обеспечения безопасности используются токены, а ответы обычно возвращаются в формате JSON.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Использование Laravel Tinker в Chrome DevTools

Статья о том, как интегрировать Laravel Tinker с Chrome DevTools для более удобной отладки и тестирования кода прямо в браузере.
Это позволяет быстрее проверять и экспериментировать с кодом Laravel, используя привычные инструменты Chrome.
Читать статью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#вакансии
👨‍💻 PHP Developer (Middle/Senior)
200 000 —‍ 400 000 ₽
Удаленно (Москва)

Marfatech — компания, которая разрабатывает собственные высокотехнологичные продукты в сфере Digital-маркетинга, Data Science и BI-аналитики.

Требования
🔵 Знание ООП, PHP, MySQL.
🔵 Опыт работы с Symfony желателен.
🔵 Уверенное владение паттернами проектирования.
🔵 Использование систем контроля версий (Git).
Подробнее о вакансии

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

Разработчик создал SQL Noir — интерактивную детективную игру, где расследования ведутся с помощью SQL-запросов.

Погружаешься в сюжет и решаешь загадки с реальными SQL-запросами.
Ссылка

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

filter_var - это универсальная функция для проверки и фильтрации данных. С её помощью можно валидировать email, URL или IP-адреса, а также очищать строки или числа. Это упрощает защиту приложения от некорректных данных и снижает риск атак.

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

Современный, централизованный, хорошо типизированный, неблокируемый набор API

Библиотека представляет собой современную, согласованную, централизованную и строго типизированную стандартную библиотеку для PHP. Ее цель — предоставить разработчикам PHP набор неблокирующих API, которые упрощают и стандартизируют выполнение общих задач, таких как работа со строками, массивами, генерация случайных чисел и другие операции.

Использование этой библиотеки может поспособствовать повышению качества и читаемости кода, обеспечивая единообразие и надежность при решении повседневных задач.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 Использование хелперов даты в конструкторе запросов Laravel

В Laravel версии 11.42 были добавлены новые методы построителя запросов(Query Builder), позволяющие работать с относительными датами. Эти методы повышают читаемость и упрощают написание условий, связанных с датами, в ваших моделях.

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

Новые методы, такие как whereNowOrPast, whereFuture, whereAfterToday, orWhereBeforeToday и другие, позволяют писать более лаконичный и понятный код для работы с датами. Они инкапсулируют логику сравнения дат, делая код более выразительным и легким для понимания.
Официальный сайт

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

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


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

Фишки

🟠Анализ и подсветка: выявление проблем в коде с помощью настраиваемых правил и плагинов.

🟠Автоматические исправления: Применяйте исправления к проблемам, связанным с линтингом, для поддержания чистоты кодовой базы.

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

🟠Семантические проверки: Убедитесь в корректности кода с помощью надежного семантического анализа.

🟠Визуализация AST: Изучите структуру кода с помощью разбора абстрактного синтаксического дерева (AST).


Установка через curl в одну строку: curl --proto '=https' --tlsv1.2 -sSf https://carthage.software/mago.sh | bash
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Что такое Composer и как его использовать?

Composer - это менеджер зависимостей для РНР, позволяющий добавлять библиотеки в проект и управлять их версиями. Он автоматически загружает нужные пакеты и создаёт автозагрузчик для их использования.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN 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
#статьи
😬 Как организовать структуру приложения

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

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

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