Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
10.5K subscribers
1.74K photos
29 videos
29 files
4.55K links
Все самое полезное для пхпшника в одном канале.

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

Учиться у нас: clc.to/M561SQ

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

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
⚡️ PHP 8.6: фичи заморожены

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

Для разработчиков расширений и инструментов это хороший момент подключить PHP 8.6 в CI и проверить совместимость до выхода RC.

После feature freeze в ветку ещё могут попадать небольшие исправления и изменения с одобрения Release Managers, но крупные RFC-фичи уже ждут следующего релиза 😬

📌 Если у вас есть PHP-библиотеки, расширения или инструменты вокруг php-src — самое время прогнать их на 8.6.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤‍🔥4
🐘 PHP 8.4: Property Hooks — год спустя, стоит ли ими пользоваться?

Property Hooks позволяют описывать логику чтения и записи прямо у свойства — без отдельных getX() и setX():


class User
{
public string $email {
set => strtolower(trim($value));
}

public string $displayName {
get => ucfirst($this->firstName);
}
}


Особенно полезны для:

→ нормализации данных
→ валидации
→ вычисляемых свойств
→ DTO и Value Objects

А с asymmetric visibility можно оставить свойство публичным для чтения, но запретить изменение извне:


public private(set) string $email;


📌 Но мигрировать проект только ради Property Hooks не стоит. Если PHP 8.4+ уже используется, hooks хорошо подходят для точечного рефакторинга там, где накопились однотипные getter/setter.

⚠️ Property Hooks несовместимы с readonly.

🔗 Источник

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
6
🔖 Laravel tip: не загружайте большие файлы целиком в память

Если файл нужно переложить из одного хранилища в другое, необязательно делать get() и получать весь файл как строку.

➡️ Laravel умеет работать с потоками:


$stream = Storage::disk('s3')
->getDriver()
->readStream($sourceFile);

Storage::disk('sftp')->put($targetFile, $stream);


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

➡️ То же самое работает при загрузке локального файла:


Storage::disk('s3')->put(
$targetFile,
fopen($sourceFile, 'r')
);


📌 Для небольших файлов разница может быть незаметна. Для сотен мегабайт или гигабайт — уже совсем другая история.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍2
💡 Laravel tip: filled() для проверки входных данных

В Laravel не всегда нужно отдельно проверять наличие поля и его значение.

🈶 Если нужно понять, что параметр передан и не является пустым, есть filled():


if ($request->filled('email')) {
// ...
}


В отличие от has(), здесь проверяется не только наличие ключа, но и то, что значение не является blank. При этом 0 и false считаются заполненными.

📌 Удобный маленький метод, который убирает лишние проверки из условной логики.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
5🥱4
Итоги недели 🙂

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
😁16💯21🌚1
🤔 PHP tip: когда ?? лучше, чем isset()

Если нужно взять значение и подставить запасное, необязательно сначала проверять isset():


$name = isset($request['name'])
? $request['name']
: 'Guest’;


🔵 В PHP есть оператор null coalescing:


$name = $request['name'] ?? 'Guest’;


Он вернёт 'Guest', если значение отсутствует или равно null.

🔵 При этом false, 0 и '' считаются значениями и не заменяются:


$value = 0 ?? 100; // 0


📌 Простое правило:

?? → «возьми значение, а если его нет — используй это».
isset() → «проверь, существует ли значение и не null ли оно».

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
php roadmap 2026.pdf
328.6 KB
С чего начать изучение PHP и куда двигаться дальше? Собрали путь от базового синтаксиса до уровня, где в дело уже входят Laravel/Symfony, тестирование, PHPStan, профилирование, кеширование и PHP-FPM.

Сохраняйте roadmap, чтобы не потеряться в огромном экосистемном дереве PHP 🔖

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🤩 Вы кешируете запросы в Redis, но забыли про OPcache?

PHP компилирует каждый .php-файл в байткод при каждом запросе — если не настроен OPcache. Это означает лишние CPU-циклы на парсинг даже самого тривиального хелпера.

Минимальный конфиг для прода:


; включаем
opcache.enable=1
opcache.enable_cli=1

; кол-во кешируемых файлов (>= числа файлов в проекте)
opcache.max_accelerated_files=20000

; размер разделяемой памяти (MB)
opcache.memory_consumption=256

; кешируем строки — экономим RAM
opcache.interned_strings_buffer=16

; в продакшне: 0 (не проверять изменения файлов)
opcache.validate_timestamps=0


📍 Почему validate\_timestamps=0 в проде?

При каждом запросе PHP проверяет mtime файла на диске. На высоких RPS — это сотни лишних stat()-syscall'ов в секунду. Инвалидируйте кеш вручную через opcache_reset() или перезапуск PHP-FPM при деплое.

💡 Хотите проверить, что лежит в кеше и сколько памяти занято? Используйте opcache_get_status() — или поставьте opcache-gui для визуального мониторинга.

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤩 Ленивая инициализация без proxy-хаков

В PHP 8.4 ленивые объекты появились прямо в движке. Это особенно полезно для ORM, DI-контейнеров и объектов, создание которых может быть дорогим.

Создать lazy ghost можно через Reflection:


$reflector = new ReflectionClass(Order::class);

$order = $reflector->newLazyGhost(
function (Order $order): void {
$order->__construct(loadFromDb());
}
);


На этом этапе конструктор ещё не выполнялся. Когда объекту понадобится состояние, PHP вызовет initializer и объект инициализируется.

Есть и второй вариант — newLazyProxy(): он при инициализации создаёт реальный объект и проксирует дальнейшие обращения к нему.


📌 Тяжёлая работа выполняется только когда объект действительно понадобится. Это может быть полезно для ленивой загрузки данных или зависимостей.

И важный момент: lazy objects не означают автоматическое ускорение всего приложения. Если объект в итоге всегда используется, выигрыш от откладывания инициализации может быть минимальным.

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
🐘 PHP 8.6 Beta 2 — завтра. Что делать с бетой?

13 августа вышла Beta 1, а 27 августа запланирована Beta 2. Дальше по календарю: Beta 3 — 10 сентября, RC1 — 24 сентября и GA — 19 ноября.

Новые RFC для 8.6 уже не проходят — сейчас фокус смещается на совместимость, регрессии и баги.

➡️ Если поддерживаете библиотеку, фреймворк, CMS или расширение, самое время прогнать тесты на PHP 8.6.

Обычному приложению необязательно переходить на бету в проде. А вот отдельный CI-job с beta-версией может заранее показать, где релиз что-то сломал.

🤩 Источник

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
🤩 PhpStorm + Laravel: меньше прыжков между окнами

В PhpStorm появился отдельный Laravel Tool Window, который собирает несколько вещей, ради которых раньше приходилось открывать терминал, логи и браузер.

🤩 запуск Artisan-команд прямо из IDE
🤩 просмотр локальных и Sentry-логов
🤩 разбор ошибок с AI
🤩 управление Laravel Cloud deployments и env-переменными

🤩 Особенно интересен сценарий с ошибкой: открыл лог → нашёл exception → разобрал его через AI, не копируя stack trace вручную.

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
10😁4🥱1
🤩 webmozart/assert: guard-условия без простыней if/throw

Вместо:


if (!is_string($name) || $name === '') {
throw new InvalidArgumentException(
'Name must be a non-empty string'
);
}


можно написать:


use Webmozart\Assert\Assert;

Assert::stringNotEmpty($name);
Assert::email($email);
Assert::range($age, 18, 99);
Assert::allInstanceOf(User::class, $users);


🤩 Библиотека берёт на себя проверку условия и выбрасывает исключение с понятным сообщением, если оно нарушено. Особенно удобно использовать такие проверки на границах приложения — например, в конструкторах Value Object или сервисов.

Установка:


composer require webmozart/assert


📌 В итоге вместо десятков однотипных if/throw получаем компактные и единообразные guard-условия.

🔗 Документация

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
🤩 5 PHP-приёмов, которые стоит держать в арсенале

Без библиотек — всё уже есть в языке:


// Быстро собрать список/словарь
$emails = array_column($users, 'email');
$map = array_column($users, 'email', 'id');

// Присвоить только если значения ещё нет
$config['timeout'] ??= 30;

// Объединить массивы с переопределением
$query = [...$defaults, 'limit' => 50];

// Проверить, является ли массив списком
array_is_list([1, 2, 3]); // true

// Передать метод напрямую как callable
$ids = array_map(User::getId(...), $users);


Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
🤖 PhpStorm научился управлять skills для coding agents

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

В PhpStorm 2026.2 появился отдельный Skills Manager:

🤩 устанавливать skills из каталога
🤩 подключать внешние registry, включая GitHub
🤩 импортировать skills из Claude Code и Codex
🤩 управлять ими прямо из IDE

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

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥱1