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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
😧 Почему strtr() иногда лучше, чем str_replace()

Если нужно заменить сразу несколько строк, многие используют 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" и до второй замены уже не доходит.

🔴 strtr() работает иначе:


echo strtr($input, $map);
// foo and bar


Функция выполняет один проход по строке и всегда выбирает самое длинное совпадение. Уже заменённые части строки повторно не обрабатываются.

Благодаря этому:

— не нужно сортировать шаблоны по длине;

— замены не влияют друг на друга;

— результат получается более предсказуемым.


Если требуется заменить несколько независимых подстрок по словарю вида "что" => "на что", strtr() часто оказывается более удачным выбором.

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7🔥41🥱1
💡 Laravel-совет

Директива @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
👍52
📈 Почему память в PHP-воркерах только растёт — и это нормально

Если вы переходите с 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👍21
🤔 Вопрос с собеседования

Планируется ли внедрение нативных дженериков в PHP в ближайшем будущем?

Например:


class Box<T>
{
public function __construct(public T $value) {}
}


👇 Правильный ответ (нажми, чтобы прочитать):

Пока — нет подтверждённого релиза.

В 2026 году появился новый RFC Bound-Erased Generic Types, который предлагал добавить дженерики для классов, интерфейсов, трейтов, функций и методов. В июне предложение вынесли на голосование, но RFC был отклонён.

🈂️ Поэтому на август 2026 года нативных дженериков в PHP нет и конкретной версии, в которой они появятся, тоже нет. На практике generics по-прежнему реализуют через PHPDoc и статические анализаторы вроде PHPStan и Psalm:

/**
*
@template T
*/
class Box
{
/**
@param T $value */
public function __construct(public mixed $value) {}
}

👍 — знал/а
🔥 — стало понятнее

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍101
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 В Laravel 13 прокачали локальную разработку

Теперь для запуска основного 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
👍214
⚙️ clone() + readonly в PHP 8.5

Классика: есть 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);
}
}


➡️ В PHP 8.5 появился новый вариант clone():


$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
👍17🔥2
⚡️ 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
5
🔖 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👍1
💡 Laravel tip: filled() для проверки входных данных

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

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


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


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

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

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

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11💯21
🤔 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
👍9
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