Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
10.8K subscribers
1.62K photos
27 videos
26 files
4.39K links
Все самое полезное для пхпшника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/bca892d6

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
📊 match vs switch

Два инструмента, которые делают похожие вещи, но не одинаковые — и разница не стилистическая.

— switch использует нестрогое сравнение (==)
— match использует строгое (===) и является выражением

Вот классический баг, который живёт в каждом втором легаси-проекте:

$status = "0";

switch ($status) {
case 0: // "0" == 0 → true. Вот и приехали.
handleInactive();
break;
case "active":
handleActive();
break;
}


match решает это без магии:

$label = match($code) {
200, 201 => 'success',
301, 302 => 'redirect',
404 => 'not_found',
default => 'unknown',
};


Несколько значений на один arm можно указать через запятую. Результат — значение, не сайд-эффект. Можно прямо в return или аргумент функции.

Про UnhandledMatchError: match без default бросает исключение, если значение не попало ни в один arm. switch молча пропускает. Это не недостаток match — это контракт. Явный фейл лучше тихого игнорирования.

🔹 Когда всё-таки switch:

— нужен fallthrough осознанно
— легаси на PHP 7
— в arm несколько выражений подряд, а не одно возвращаемое значение

Выбор инструмента — это не про стиль. Это про то, какие гарантии тебе нужны от кода.

🐸 Библиотека пхпшника

#элементарный_выбор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
У «Библиотеки программиста» появился резервный канал в мессенджере MAX

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

Контент в MAX будет дублировать телеграмный — основной нашей площадкой был и остаётся Telegram. Надеемся, это временная мера.

Подписаться на «Библиотеку программиста» в MAX
🥱18😁5😢3👾3
Кажется, мы окончательно перешли от игрушек к суровому AgentOps

Приглашаем на наш обновлённый курс по разработке ИИ-агентов. Никакой воды про «будущее нейросетей», только инженерный подход.

На курсе мы:

— пошагово строим готовые системы на LangGraph, CrewAI и MCP;
— настраиваем кэширование и роутинг, чтобы бот не сожрал токены;
— разбираемся со стейтом, учимся дебажить через time-travel и прикручиваем human-in-the-loop;
— выводим RAG в прод так, чтобы безопасники не завернули архитектуру из-за 152-ФЗ.

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

Кстати, на днях мы пилили агента в прямом эфире, если пропустили — есть запись вебинара.


Сегодня последний день, когда можно забрать курс по старым ценам. Базовый тариф сейчас стоит 49 000 ₽ (вместо 62 990 ₽), продвинутый трек — 99 000 ₽ (вместо 124 990 ₽). Если не хочется отдавать всю сумму сразу, есть рассрочка. Торопитесь — на потоке осталось всего 5 мест!

Зафиксировать цену и перейти к сборке своих агентов
Зачем использовать yield вместо return с массивом?

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

Главный профит — память. Если обрабатываешь CSV на 500 тысяч строк, с массивом ты загрузишь всё в RAM разом. С генератором в памяти живёт одна строка. Генератор реализует интерфейс Iterator, с ним работает foreach. Минус — нельзя перемотать назад, обойти можно только один раз. Используй когда данных много, порядок линейный, и случайный доступ не нужен.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3
⌨️ Топ-вакансий по PHP за неделю

PHP разработчик (Symfony, Rest API) — от 100 000 до 150 000 ₽ — удалёнка

Middle PHP разработчик — от 150 000 до 250 000 ₽ — гибрид/удалёнка (Воронеж)

Team Lead (PHP, Laravel) — от 500 000 ₽ — удалёнка/гибрид (Москва)

➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥1
👀 Reli — профилировщик выборки или памяти

Это профилировщик, написанный на PHP, который считывает информацию о запуске виртуальной машины PHP извне процесса.

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

🔗 Github

#инструменты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥31
🐘 PHP для начинающих (и напоминание для опытных)

🔹 Query Scopes

Смотришь на свой код и замечаешь одно и то же в пяти местах:
->where('status', 'active')->where('deleted_at', null)
->where('status', 'active')->where('deleted_at', null)
->where('status', 'active')->where('deleted_at', null)


Это не переиспользование кода. Это его копирование. Разница важная.

▪️ Local Scope — прячем логику в модель

// User.php
public function scopeActive(Builder $query): Builder
{
return $query->where('status', 'active')
->whereNull('deleted_at');
}

public function scopeVerified(Builder $query): Builder
{
return $query->whereNotNull('email_verified_at');
}


Теперь вместо цепочки условий — читаемый вызов
// Было
User::where('status', 'active')
->whereNull('deleted_at')
->whereNotNull('email_verified_at')
->get();

// Стало
User::active()->verified()->get();


▪️ Scope с параметром


Иногда нужна гибкость. Scope принимает аргументы:
public function scopeOlderThan(Builder $query, int $days): Builder
{
return $query->where('created_at', '<', now()->subDays($days));
}
phpUser::active()->olderThan(30)->get();


▪️ Global Scope — когда условие должно быть всегда


Если SoftDeletes работает по всему приложению — это глобальный скоуп под капотом. Можно написать свой:
// В модели
protected static function booted(): void
{
static::addGlobalScope('tenant', function (Builder $builder) {
$builder->where('tenant_id', auth()->user()?->tenant_id);
});
}


Теперь все запросы к этой модели автоматически фильтруются по тенанту. Без единого where в контроллерах.

Библиотека пхпшника

#php_азбука
👍74🔥2🥱1
⚙️ Laravel Process Pipe

С версии Laravel 10.7 появилась нативная поддержка конвейера процессов (pipe). Теперь можно легко передавать вывод одного процесса на вход другого — прямо из PHP-кода, без костылей.

use Illuminate\Process\Pipe;
use Illuminate\Support\Facades\Process;

$result = Process::pipe(function (Pipe $pipe) {
$pipe->command('cat example.txt'),
$pipe->command('grep -i "laravel"'),
});

if ($result->successful()) {
// ...
}


Это аналог привычного cat example.txt | grep -i "laravel" в терминале, только внутри Laravel.

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

— Обработка файлов и потоков данных без временных переменных
— Чистый и читаемый код вместо вызовов shell_exec
— Удобное тестирование через фейковые процессы

Маленькая фича, но приятная 🙂

Библиотека пхпшника

#vardump
👍21😁1
Почитали тут свежий отчёт по рынку ИИ-ускорителей в РФ: оказывается, 54% компаний тормозят внедрение ИИ исключительно из-за конских цен на инфраструктуру.

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

По сути, сейчас мало уметь собирать RAG. Нужно считать токены, настраивать time-travel дебаг в LangGraph и уметь роутить запросы на лету. Всё это мы учли в обновлённом курсе по разработке AI-агентов, где акцент сделан именно на AgentOps и жёсткий контроль ресурсов.

Также в программе:

— оценка качества, трейсинг и защита от деградации пайплайнов;
— мультиагентные паттерны и интеграция по протоколу MCP;
— локальный деплой Open Source под 152-ФЗ (когда данные нельзя выносить наружу).

Кажется, это единственный адекватный roadmap по переходу от блокнотов к enterprise-решениям.

Прямо сейчас можно урвать курс с увесистой скидкой (49 000 ₽ 62 990 ₽ за базовый тариф и 99 000 ₽ 124 990 ₽ за продвинутый трек), но стоит поторопиться — на потоке осталось всего 5 мест.

👉 Зафиксировать цену и начать собирать агентов, за которых не стыдно в проде