Пых

Description
Блог @vudaltsov о разработке на PHP.

На канале не размещается реклама и вакансии. Подробнее: t.me/phpyh/72.
Subscribers

We recommend to visit

Вылавливаем интересную нам тему в море сырой информации.

Связь: @rybar_feedback_bot
Резерв: @rybar_broadcast_bot

Поддержать проект:
https://telegra.ph/Rekvizity-dlya-pomoshchi-komande-Rybarya-05-03

Last updated 3 months, 2 weeks ago

Военный корреспондент Издательского дома "Комсомольская правда" Александр Коц.

https://www.facebook.com/alexander.kots.7

Для связи: @sasha_kots

Менеджер: @KirnossOff

Last updated 3 months, 2 weeks ago

Новости звёзд и не только

Сотрудничество: @zzorty

Предложить Новость: @taboo_news_bot

Last updated 3 months, 3 weeks ago

4 months ago
4 months, 1 week ago
Сегодня коллеги поздравили меня прекрасным PHP-тортом! ***🎉******💚***

Сегодня коллеги поздравили меня прекрасным PHP-тортом! 🎉💚

4 months, 2 weeks ago

📈 Выборочная оптимизация на примере Composer 2.2

Рекомендую январский выпуск Пятиминутки PHP, в котором Пётр разобрался, как разработчики ускорили Composer, и поставил под сомнение их результат.

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

  1. Исследуем очередное узкое горлышко в программе.
  2. Ищем предпосылку, при которой можно можно провести оптимизацию подпрограммы.
  3. Выдвигаем гипотезу о том, что при использовании программы предпосылка выполняется достаточно часто.
  4. В случае подтверждения гипотезы, проводим оптимизацию для этой предпосылки.

Здесь важен баланс между стоимостью оптимизации (затраты на внедрение, прирост сложности кода) и профитом от неё (изменение целевых метрик, доля улучшенных сценариев). Иными словами, игра должна стоить свеч.

https://5minphp.ru/episode95/

Пятиминутка PHP

Оптимизация производительности в Composer 2.2

В декабре 2021 года вышло обновление пакетного менеджера Composer, версия 2.2. Заявлено увеличение производительност в некоторых случаях на 90%. Как это возможно и почему Composer раньше …

***📈*** **Выборочная оптимизация на примере Composer 2.2**
4 months, 2 weeks ago

🤯 Перестань не использовать функции в PHP!

Функции??? Да! Те самые функции, которые когда-то все спокойно юзали, но которые позже заменили класс-ориентированным программированием с неймингом вида Utils, *Helper и т.д.

Функция — это никакой не code smell, а удобная конструкция процедурного программирования, которую не стоит избегать и недооценивать. Если ты считаешь наоборот, я попробую тебя переубедить!

Сначала разберём два традиционных замечания к функциям. Во-первых, в PHP для функций не предусмотрен автолоадинг. Да, файлы с функциями нужно явно прописывать в autoload.files, они будут загружаться на каждом хите. Однако, этот оверхед пренебрежим в случае "умирающего" PHP и отстутствует вообще, если используется preloading или PHP "не умирает". Поэтому тут в минусы запишем только возню с composer.json.

Во-вторых, функции нельзя мокать. Это традиционное мокистское заявление, на которое почти всегда можно ответить: "Так не мокай!" и послать к Фаулеру. Функция — это имплементация, а не интерфейс. "Интерфейс" функции time — это callаble в PHP и callable(): int в Psalm/PHPStan. Чтобы заабстрагировать функцию, её следует объявить как callable инъекцию или параметр (см. пост #133), и тогда в тесте можно передать всё что угодно. Если же мы говорим про "захардкоженное" использование функции, то, если она не берёт на себя больше, чем должна, это не составит проблем. Никто же не боится в коде "хардкодить" array_map или trim. Главное, чтобы функции сами были протестированы.

А вот плюсов я насчитал куда больше!
Функции идеально подходят для операций, не требующих организации состояния. Согласитесь, класс с приватным конструктором без состояния — это ~~кастрат~~ костыль.
Декларация функции, очевидно, лаконичнее декларации класса.
В один файл можно положить несколько функций, это не нарушает стандарты. При этом название файла не должно соответствовать имени функции.
Так же, как и классы, функции могут быть определены в неймспейсе, ничто не мешает вам объявить свои функции для каждого модуля.
Функция лаконичнее выглядит в вызывающем коде: myFunction() vs MyClass::myMethod().

Критерии хорошей функции всё те же: низкая цикломатическая сложность, небольшое количество параметров, SRP. Если функцию "раздуло", то либо её надо разбить на несколько функций с разными именами, либо задачу всё-таки надо решать с использованием классов.

Вот несколько функций из нашего проекта: https://gist.github.com/vudaltsov/eb53927894cb467588e67352e2d8f1d9.

И напоследок статья Никиты Попова, которая несколько лет назад могла мне поменять отношение к функциям: https://www.npopov.com/2012/08/10/Are-PHP-developers-functophobic.html.

Пиши в комментариях, используешь ли ты функции или нет и почему.

4 months, 3 weeks ago

📺 Очень крутая серия видео про дженерики в PHP от Brent Roose, смотрится легко и быстро.

https://youtube.com/playlist?list=PL0bgkxUS9EaKyOugEDffRzsvupBE2YEoD

YouTube

Generics in PHP #1: The basics

This is the first video in a four-part series on using generics in PHP. This video covers the basics about what generics are and what they can be used for.

5 months, 1 week ago

🤝 Встреча с программным комитетом PHP Russia 2022

• У меня есть тема, но я не решаюсь выступить.
• Я выступил на митапе, но не уверен, что мой доклад подходит для конференции.
• Однажды я подал доклад, но его отклонили, больше не хочу.
• Я хотел бы выступить, но, кажется, в нашем высоконагруженном проекте с тремя фреймворками, пятью видами БД, сотней микросервисов и кубернетесом нет ничего интересного.

Пыхарь, если при упоминании слова "конференция" у тебя проносятся такие мысли, то это замечательно, потому что ты без пяти минут докладчик! Мы ждём тебя сегодня в 19:00, чтобы вдохновить, помочь и направить. Буду рад стать твоим ментором и выступить бок о бок в сентябре!

Подробности в канале конференции: https://t.me/PHPRussiaConfChannel/295.

Telegram

PHP Russia Channel

Всем привет, 21 апреля в 19:00 приглашаем на онлайн-встречу с Программным комитетом PHP Russia. Мы принимаем доклады до 25 мая - остается всего месяц, поэтому в четверг расскажем: - про тематические секции, - какие заявки проходят в программу, -…

[***🤝***](https://t.me/PHPRussiaConfChannel/295) **Встреча с программным комитетом [PHP Russia 2022](https://phprussia.ru/moscow/2022)**
7 months, 1 week ago

```
enum EnumNaming
{
case camelCase;
case PascalCase;
case snake_case;
case SCREAMING_SNAKE_CASE;
}

dump(
EnumNaming::camelCase,
EnumNaming::PascalCase,
EnumNaming::snake_case,
EnumNaming::SCREAMING_SNAKE_CASE,
);
```

7 months, 1 week ago
7 months, 1 week ago
**Ушла из жизни Юлия** [**Insolita**](https://twitter.com/DonnaInsolita)

Ушла из жизни Юлия Insolita

Юлия — самая активная участница русского PHP-сообщества. Она контрибьютила в Open Source, возглавляла сообщество Иркутска в Telegram, помогала Роме с дайджестами, комментировала каждый стрим.

По-итальянски insolita означает "необычная", "необыкновенная". Такой Юля и была, такой мы её и запомним.

В память о Юлии предлагаю полистать её блоги на dev.to и medium.

7 months, 2 weeks ago

fromName для enum

Перечисления (енамы) бывают двух типов: чистые и ~~грязные~~ типизированные, со скалярным эквивалентом. Типизированные енамы реализуют интерфейс BackedEnum с дополнительными методами from и tryFrom — они позволяют получить перечисление по его скалярному эквиваленту ($value).

В этом посте мы попробуем добавить аналогичные методы fromName и tryFromName для получения перечисления любого типа по его имени ($name).

Для начала обратим внимание на любопытную фразу в документации: "Для вариантов перечисления применяются те же правила синтаксиса, что и для любой метки в PHP, смотрите Константы". По идее, это означает, что мы можем без рефлексии динамически работать с енамами как с константами. Попробуем!

```

enum Locale
{
case ru;
case en;

<pre>public static function tryFromName(string $name): ?self { $constant = self::class.'::'.$name; if (\defined($constant)) { return \constant($constant); } return null; } public static function fromName(string $name): self { return self::tryFromName($name) ?? throw new \ValueError(sprintf( '"%s" is not a valid name for enum "%s"', $name, self::class, )); } </pre>

}

```

Вуаля, работает! https://3v4l.org/EgBB1

Обратите внимание на комментарии @SerafimArts про нюансы использования констант и решение задачи через рефлексию.

P.S.: Задача этого поста — поиграться с перечислениями, чтобы лучше их прочувствовать. Я не призываю так делать. Если при работе с чистым енамом выясняется, что его нужно получать по имени, то лучше поменять такой енам на типизированный и использовать встроенные методы from и tryFrom.

3v4l.org

Online PHP editor | output for EgBB1

Run your php code online; get statistics, vld output and compare output from all versions.

**fromName для enum**

We recommend to visit

Вылавливаем интересную нам тему в море сырой информации.

Связь: @rybar_feedback_bot
Резерв: @rybar_broadcast_bot

Поддержать проект:
https://telegra.ph/Rekvizity-dlya-pomoshchi-komande-Rybarya-05-03

Last updated 3 months, 2 weeks ago

Военный корреспондент Издательского дома "Комсомольская правда" Александр Коц.

https://www.facebook.com/alexander.kots.7

Для связи: @sasha_kots

Менеджер: @KirnossOff

Last updated 3 months, 2 weeks ago

Новости звёзд и не только

Сотрудничество: @zzorty

Предложить Новость: @taboo_news_bot

Last updated 3 months, 3 weeks ago