PHP 8.6 вышла на финишную прямую 🚀
Июль оказался насыщенным для PHP 8.6: команда выпустила сразу три тестовые версии — Alpha 1, Alpha 2 и Alpha 3. Следующий этап — Beta 1, которая запланирована на 13 августа.
После перехода к бета-версии список новых возможностей, как правило, уже сформирован. Дальше основное внимание уделяется исправлению ошибок, совместимости и подготовке к стабильному релизу.
💡 Если вы поддерживаете библиотеку, фреймворк или крупное приложение, сейчас хорошее время добавить PHP 8.6 в CI отдельной задачей и прогнать тесты. Найти несовместимость за несколько месяцев до релиза намного проще, чем после выхода стабильной версии.
Библиотека пхпшника
Июль оказался насыщенным для PHP 8.6: команда выпустила сразу три тестовые версии — Alpha 1, Alpha 2 и Alpha 3. Следующий этап — Beta 1, которая запланирована на 13 августа.
После перехода к бета-версии список новых возможностей, как правило, уже сформирован. Дальше основное внимание уделяется исправлению ошибок, совместимости и подготовке к стабильному релизу.
Финальный релиз PHP 8.6 ожидается 19 ноября 2026 года.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🌚4🤔3
Не все знают, что начиная с PHP 8.0 дочерний метод может объявлять меньше именованных параметров, чем родительский. Это возможно, если несколько совместимых параметров заменяются одним variadic-параметром.
class X
{
public function foo(int $a, string $c, string ...$b): void {}
}
class Y extends X
{
public function foo(int $a, string ...$b): void {}
}
Такой код полностью корректен. Значение, которое в родительском методе попадало в $c, в дочернем станет первым элементом $b.
$x->foo(1, 'A');
$x->foo(1, 'A', 'B', 'C');
А вот так уже нельзя:
class Y extends X
{
public function foo(int $a, int ...$b): void {}
}
или
class Y extends X
{
public function foo(int $a, string $c, string $d, string ...$b): void {}
}
В первом случае меняется тип параметров, во втором — дочерний метод начинает требовать больше обязательных аргументов. Оба варианта нарушают совместимость сигнатур.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱4🌚3👍2
PHP-Cheat-Sheet.pdf
283.3 KB
Некоторые примеры относятся к версиям PHP до 8+, но в целом материал остаётся полезным.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱6👍2🌚1
Одна из самых ожидаемых возможностей PHP 8.5 — pipe-оператор (|>). Он передаёт результат выражения слева первым аргументом вызываемой функции справа, позволяя строить цепочки преобразований, которые читаются сверху вниз.
// Было
$result = strlen(htmlspecialchars(trim($input)));
// Стало
$result = $input
|> trim(...)
|> htmlspecialchars(...)
|> strlen(…);
Запись ... — это first-class callable. Такой код проще читать, отлаживать и постепенно расширять: каждый этап преобразования явно отделён от предыдущего.
Pipe-оператор особенно полезен там, где данные проходят через несколько последовательных функций — меньше вложенности, больше читаемости.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7😁7🌚4😢3
Совет по Laravel💡 : Встроенная валидация
Хотя Laravel предлагает множество правил валидации, иногда возникает необходимость в использовании пользовательских правил.
Обычно они записываются в пользовательском классе.
Но знаете ли вы, что можно выполнять и валидацию в строке? 🚀
Библиотека пхпшника
Хотя Laravel предлагает множество правил валидации, иногда возникает необходимость в использовании пользовательских правил.
Обычно они записываются в пользовательском классе.
Но знаете ли вы, что можно выполнять и валидацию в строке? 🚀
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱6👍5🌚4
Кажется, у онлайн-обучения появился формат, которого давно не хватало 👇
Forwarded from Proglib.academy | IT-курсы
Логично, что обучение тоже постепенно приходит к той же модели: не покупать отдельный курс под каждую новую тему, а иметь доступ ко всей библиотеке и выбирать, что актуально именно сейчас.
Такой формат недавно появился и в Proglib Academy. Вместо одного курса — доступ сразу ко всей библиотеке и новым материалам, которые появляются в подписке
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁20🥰2
Если нужно заменить сразу несколько строк, многие используют str_replace(). Но есть нюанс: замены выполняются последовательно, поэтому результат одной замены может попасть под следующую.
$map = [
'foo' => 'bar',
'foobar' => 'foo',
];
$input = 'foobar and foo';
echo str_replace(
array_keys($map),
array_values($map),
$input
);
// bar bar and bar
Сначала "foo" превращается в "bar", поэтому "foobar" становится "barbar" и до второй замены уже не доходит.
echo strtr($input, $map);
// foo and bar
Функция выполняет один проход по строке и всегда выбирает самое длинное совпадение. Уже заменённые части строки повторно не обрабатываются.
Благодаря этому:
— не нужно сортировать шаблоны по длине;
— замены не влияют друг на друга;
— результат получается более предсказуемым.
Если требуется заменить несколько независимых подстрок по словарю вида "что" => "на что", strtr() часто оказывается более удачным выбором.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7🔥5❤1🥱1
Директива
@env_required() позволяет проверять, что переменная среды установлена и имеет значение, отличное от null. Она может быть полезна для обеспечения того, чтобы приложение работало правильно только при наличии определенных переменных среды.В нашем примере директива
@env_required() используется для проверки переменной среды APP_KEY. Если переменная не установлена, будет выброшено исключение.Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱6👍5😁4
Как работает очередь задач на примере создания миниатюр для видео.
Цель: после загрузки видео оно должно высветиться в виде миниатюры
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3
Если вы переходите с PHP-FPM на RoadRunner, Laravel Queue или Symfony Messenger — вы увидите один и тот же эффект:
Память растёт ступеньками и никогда не падает.
40 → 200 → 350 МБ… и так до перезапуска.
Unset, GC, collect_cycles() — не помогают.
Это не утечка. Это архитектура PHP.
PHP использует Zend Memory Manager: он выделяет память крупными чанками (2–4 МБ) и не отдаёт их ОС назад, даже если внутри всё освобождено.
Каждый пик — новый baseline. Обработали 100k записей → память выросла → процесс будет держать этот объём до конца жизни.
ORM ->all() или ->get() на десятки тысяч записей
большой файл в file_get_contents()
накопление массивов
сложные eager-loading графы ORM
— Стриминг вместо коллекций:
User::lazy()->each(fn($u) => processUser($u));
или:
Record::chunk(100, function ($rows) {
foreach ($rows as $r) processRecord($r);
});
✔️ Doctrine:
foreach ($q->toIterable() as $u) {
process($u);
$em->detach($u);
}
— Изоляция тяжёлых операций в функцию — память освобождается при выходе из scope.
— Ротация воркеров — обязательна:
Laravel:
php artisan queue:work --max-jobs=1000
RoadRunner:
pool:
max_jobs: 1000
Messenger:
messenger:consume --limit=1000
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8😁3🤔3👍2❤1
Планируется ли внедрение нативных дженериков в PHP в ближайшем будущем?
Например:
class Box<T>
{
public function __construct(public T $value) {}
}
В 2026 году появился новый RFC Bound-Erased Generic Types, который предлагал добавить дженерики для классов, интерфейсов, трейтов, функций и методов. В июне предложение вынесли на голосование, но RFC был отклонён.
/**
*
*/
class Box
{
/**
public function __construct(public mixed $value) {}
}
👍 — знал/а
🔥 — стало понятнее
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍11❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Теперь для запуска основного dev-окружения достаточно:
php artisan dev
php artisan dev
│
├── server → php artisan serve
├── queue → queue worker
├── logs → Laravel Pail
└── vite → frontend dev server
А управлять всем этим можно прямо из терминального интерфейса: переключаться между общим и раздельным выводом процессов, перезапускать их, очищать логи и искать по выводу.
Свои процессы тоже можно зарегистрировать — например, Reverb или listener для Stripe. Меньше отдельных терминалов и ручного запуска сервисов при каждом старте проекта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤4
Классика: есть immutable Value Object, и нужно получить его копию с одним изменённым значением. Раньше для этого часто писали отдельные with...()-методы:
final readonly class Money
{
public function __construct(
public int $amount,
public string $currency,
) {}
public function withAmount(int $amount): self
{
return new self($amount, $this->currency);
}
}
$price = new Money(1000, 'USD');
$discounted = clone($price, [
'amount' => 850,
]);
В результате $price остаётся прежним, а $discounted получает новое значение amount. Главная фишка: так можно переопределять даже readonly-свойства во время клонирования.
Удобно для Value Object, DTO и immutable-моделей, где раньше ради каждого изменения приходилось писать отдельный withSomething().
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥2
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():
Особенно полезны для:
→ нормализации данных
→ валидации
→ вычисляемых свойств
→ DTO и Value Objects
А с asymmetric visibility можно оставить свойство публичным для чтения, но запретить изменение извне:
📌 Но мигрировать проект только ради Property Hooks не стоит. Если PHP 8.4+ уже используется, hooks хорошо подходят для точечного рефакторинга там, где накопились однотипные getter/setter.
⚠️ Property Hooks несовместимы с readonly.
🔗 Источник
🐸 Библиотека пхпшника
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 несовместимы с readonly.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Если файл нужно переложить из одного хранилища в другое, необязательно делать get() и получать весь файл как строку.
$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 не всегда нужно отдельно проверять наличие поля и его значение.
if ($request->filled('email')) {
// ...
}
В отличие от has(), здесь проверяется не только наличие ключа, но и то, что значение не является blank. При этом 0 и false считаются заполненными.
📌 Удобный маленький метод, который убирает лишние проверки из условной логики.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🥱4