Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
Все самое полезное для пхпшника в одном канале. По рекламе: @tproger_sales_bot Учиться у нас: clc.to/M561SQ Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Показати більше📈 Аналітичний огляд Telegram-каналу Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
Канал Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter (@phpproglib) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 10 461 підписників, посідаючи 11 653 місце в категорії Технології та додатки та 60 713 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 10 461 підписників.
За останніми даними від 25 жовтня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -29, а за останні 24 години на -3, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 15.48%. Протягом перших 24 годин після публікації контент зазвичай збирає 7.28% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 1 620 переглядів. Протягом першої доби публікація в середньому набирає 762 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 2.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як php, laravel, пхпшника, artisan, api.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Все самое полезное для пхпшника в одном канале.
По рекламе: @tproger_sales_bot
Учиться у нас: clc.to/M561SQ
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b”
Завдяки високій частоті оновлень (останні дані отримано 26 жовтня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
if ($request->filled('email')) {
// ...
}
В отличие от has(), здесь проверяется не только наличие ключа, но и то, что значение не является blank. При этом 0 и false считаются заполненными.
📌 Удобный маленький метод, который убирает лишние проверки из условной логики.
🐸 Библиотека пхпшника
$stream = Storage::disk('s3')
->getDriver()
->readStream($sourceFile);
Storage::disk('sftp')->put($targetFile, $stream);
Поток читается и передаётся дальше без необходимости загружать весь файл в память приложения.
➡️ То же самое работает при загрузке локального файла:
Storage::disk('s3')->put(
$targetFile,
fopen($sourceFile, 'r')
);
📌 Для небольших файлов разница может быть незаметна. Для сотен мегабайт или гигабайт — уже совсем другая история.
🐸 Библиотека пхпшника
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.
🔗 Источник
🐸 Библиотека пхпшника
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().
🔗 Источник
🐸 Библиотека пхпшника
php artisan dev
➡️ Команда собирает в одном терминале сразу несколько процессов:
php artisan dev
│
├── server → php artisan serve
├── queue → queue worker
├── logs → Laravel Pail
└── vite → frontend dev server
А управлять всем этим можно прямо из терминального интерфейса: переключаться между общим и раздельным выводом процессов, перезапускать их, очищать логи и искать по выводу.
Свои процессы тоже можно зарегистрировать — например, Reverb или listener для Stripe. Меньше отдельных терминалов и ручного запуска сервисов при каждом старте проекта ✅
🔗 Источник
🐸 Библиотека пхпшника
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) {}
}
👍 — знал/а
🔥 — стало понятнее
🐸 Библиотека пхпшника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🐸 Библиотека пхпшника
@env_required() позволяет проверять, что переменная среды установлена и имеет значение, отличное от null. Она может быть полезна для обеспечения того, чтобы приложение работало правильно только при наличии определенных переменных среды.
В нашем примере директива @env_required() используется для проверки переменной среды APP_KEY. Если переменная не установлена, будет выброшено исключение.
Библиотека пхпшника$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() часто оказывается более удачным выбором. Библиотека пхпшника
Логично, что обучение тоже постепенно приходит к той же модели: не покупать отдельный курс под каждую новую тему, а иметь доступ ко всей библиотеке и выбирать, что актуально именно сейчас.Такой формат недавно появился и в Proglib Academy. Вместо одного курса — доступ сразу ко всей библиотеке и новым материалам, которые появляются в подписке 😎 🔗 Подробнее 🏃♀️ Proglib Academy
// Было
$result = strlen(htmlspecialchars(trim($input)));
// Стало
$result = $input
|> trim(...)
|> htmlspecialchars(...)
|> strlen(…);
Запись ... — это first-class callable. Такой код проще читать, отлаживать и постепенно расширять: каждый этап преобразования явно отделён от предыдущего.
Pipe-оператор особенно полезен там, где данные проходят через несколько последовательных функций — меньше вложенности, больше читаемости.
🔗 Источник
Библиотека пхпшника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 {}
}
В первом случае меняется тип параметров, во втором — дочерний метод начинает требовать больше обязательных аргументов. Оба варианта нарушают совместимость сигнатур.
💡 Главное правило простое: при переопределении метод должен принимать как минимум все вызовы, которые были допустимы для метода родительского класса.
Библиотека пхпшникаФинальный релиз PHP 8.6 ожидается 19 ноября 2026 года.💡 Если вы поддерживаете библиотеку, фреймворк или крупное приложение, сейчас хорошее время добавить PHP 8.6 в CI отдельной задачей и прогнать тесты. Найти несовместимость за несколько месяцев до релиза намного проще, чем после выхода стабильной версии. Библиотека пхпшника
npx terser src/app.js -o dist/app.min.js -c -m
💡 Минифицирует ваш JavaScript, сокращает код и уменьшает размер файлов, используя Terser.
Команда (Node.js + CleanCSS для CSS):
npx clean-css-cli -o dist/style.min.css src/style.css
💡 Минифицирует CSS, удаляя пробелы, комментарии и упрощая записи, что ускоряет загрузку страницы.
❓ Зачем это нужно?
🔹 Ускорение загрузки страниц: Меньший размер JS и CSS сокращает время передачи данных. 🔹 Оптимизация производительности: Минифицированный код обрабатывается браузером быстрее. 🔹 Чистый продакшн: Убираются ненужные пробелы и комментарии, что делает код компактным.⚙️ Дополнительные опции Terser: -c или --compress: Сжимает код, удаляя лишние конструкции. -m или --mangle: Переименовывает переменные и функции, уменьшая размер. --source-map: Генерирует source map для удобного дебага минифицированного кода. Пример с source map: npx terser src/app.js -o dist/app.min.js -c -m --source-map ⚙️ Дополнительные опции CleanCSS: --compatibility — задаёт совместимость с браузерами. --level — уровень оптимизации (1 или 2). Пример:
npx clean-css-cli -o dist/style.min.css src/style.css --level 2
Библиотека пхпшника