📊 Итоги года
В контексте PHP год пролетел для меня очень быстро, думаю, вы заметили по активности. Одна из причин — много интересной работы. Зато накопил уйму идей для постов и видео — буду исправляться.
Ачивки
💡 Попробовали с Ромой новые форматы: интервью, Clubhouseчто это?, Дайджест Live. Запустили канал с мемесами PHP умирает?!
🎙 Выступил на 4 оффлайн-конференциях и митапах. PHP привёз меня в Брянск, Нижний Новгород и Ростов-на-Дону. Зовите ещё — я с удовольствием путешествую по России!
🤣 Меня показали по телеку, и там я ответил на главный вопросвека репортёра: «Скажите, за базами данных будущее?»
🧑🎨 Пых получил свой логотип.
👊 В Пыхтелке появились админы, флуда и спама стало меньше. Спасибо ребятам большое!
😳 Моё отношение к трейтам не изменилось, но я законтрибьютил один в roave/dont.
🔥 Вошёл в программный комитет PHP Russia 2022.
Фейлы
☹️ Нерелиз Thesis. Но я не отчаиваюсь!Yii3 ведь тоже не вышел. Недавно уделил либе несколько дней в отпуске и решил пару организационно-архитектурных проблем. Обещать ничего не буду, просто скажу, что идея жива и мы по-прежнему радостно используем Thesis на работе.
Всем спасибо за участие в сообществе, до встречи в 🐯 году!
Пройдите, пожалуйста, опрос — он наводит мост в 2022!
https://phpsurvey.typeform.com/to/fqX8iwnT
В контексте PHP год пролетел для меня очень быстро, думаю, вы заметили по активности. Одна из причин — много интересной работы. Зато накопил уйму идей для постов и видео — буду исправляться.
Ачивки
💡 Попробовали с Ромой новые форматы: интервью, Clubhouse
🎙 Выступил на 4 оффлайн-конференциях и митапах. PHP привёз меня в Брянск, Нижний Новгород и Ростов-на-Дону. Зовите ещё — я с удовольствием путешествую по России!
🤣 Меня показали по телеку, и там я ответил на главный вопрос
🧑🎨 Пых получил свой логотип.
👊 В Пыхтелке появились админы, флуда и спама стало меньше. Спасибо ребятам большое!
😳 Моё отношение к трейтам не изменилось, но я законтрибьютил один в roave/dont.
🔥 Вошёл в программный комитет PHP Russia 2022.
Фейлы
☹️ Нерелиз Thesis. Но я не отчаиваюсь!
Всем спасибо за участие в сообществе, до встречи в 🐯 году!
Пройдите, пожалуйста, опрос — он наводит мост в 2022!
https://phpsurvey.typeform.com/to/fqX8iwnT
Typeform
Explore Typeform | Create your own surveys, quizzes, forms
Experience a slick way of creating forms with Typeform. Try templates for quizzes, surveys, forms and more.
👍7🔥4
Организация миграций Doctrine
В Doctrine Migrations есть классный параметр
Переключиться можно в любой момент. Для этого достаточно поправить конфиг и запустить мою команду — она раскидает файлики по нужным директориям. Команда расчитана на дефолтный
https://symfony.com/bundles/DoctrineMigrationsBundle/3.2.x/index.html
https://www.doctrine-project.org/projects/doctrine-migrations/en/3.3/reference/configuration.html
В Doctrine Migrations есть классный параметр
organize_migrations. Он позволяет группировать файлы миграций по годам (BY_YEAR) или по годам и месяцам (BY_YEAR_AND_MONTH). Рекомендую сразу переходить на BY_YEAR_AND_MONTH.Переключиться можно в любой момент. Для этого достаточно поправить конфиг и запустить мою команду — она раскидает файлики по нужным директориям. Команда расчитана на дефолтный
Version{date} нейминг миграций.https://symfony.com/bundles/DoctrineMigrationsBundle/3.2.x/index.html
https://www.doctrine-project.org/projects/doctrine-migrations/en/3.3/reference/configuration.html
👍67🔥42
Avoid FPM reloading?
На днях гулял по документации Deployer 7 и набрёл на статью Avoid PHP-FPM Reloading.
Там даётся известная рекомендация использовать при конфигурации NGINX переменную $realpath_root вместо $document_root для
У нас так и настроено, однако от мягкой перезагрузки FPM мы не можем отказаться, так как используем preloading. И поэтому в статье меня смутила фраза "...reload can lead to dropped or failed requests".
Погуглил, вроде FPM должен корректно завершать запросы, активные на момент reload. Да и мы за пару лет не видели релевантных ошибок при деплойментах. Поэтому считаю дисклеймер неверным. Также нашёл твит на Пятиминутке PHP с полезными ссылками про деплоймент и opcache.
Вот такой дискуссионный пост получился. Пишите в комментариях, что думаете!
На днях гулял по документации Deployer 7 и набрёл на статью Avoid PHP-FPM Reloading.
Там даётся известная рекомендация использовать при конфигурации NGINX переменную $realpath_root вместо $document_root для
SCRIPT_FILENAME. Это нужно для того, чтобы в opcache попадал реальный путь вместо симлинка и не было проблем при деплойменте. То же самое можно прочитать, например, в комментариях к примерному конфигу NGINX для Symfony.У нас так и настроено, однако от мягкой перезагрузки FPM мы не можем отказаться, так как используем preloading. И поэтому в статье меня смутила фраза "...reload can lead to dropped or failed requests".
Погуглил, вроде FPM должен корректно завершать запросы, активные на момент reload. Да и мы за пару лет не видели релевантных ошибок при деплойментах. Поэтому считаю дисклеймер неверным. Также нашёл твит на Пятиминутке PHP с полезными ссылками про деплоймент и opcache.
Вот такой дискуссионный пост получился. Пишите в комментариях, что думаете!
deployer.org
Avoid PHP-FPM Reloading | Deployer
Deployer symlinks current to latest release dir.
🔥22👍16
uniqid()
Функция uniqid — простой и быстрый способ получить ±уникальную криптографически небезопасную строку.
Как она работает? Функция берёт секунды и микросекунды, прошедшие с начала эпохи Unix, и конкатенирует их в шестнадцатиричном представлении:
Таким образом, выдаваемая строка имеет длину 13 символов (как посчитать длину самому). Если требуется меньше, то отрезать нужно с конца, так как наибольшей энтропией обладают последние знаки. Например, чтобы получить 8 символов, используем выражение
Первый необязательный параметр
Второй необязательный параметр
Не стоит относиться к этой функции слишком серьёзно, но в простейших случаях, например, при именовании каких-нибудь временных штук, она избавит вас от 🚲.
Функция uniqid — простой и быстрый способ получить ±уникальную криптографически небезопасную строку.
Как она работает? Функция берёт секунды и микросекунды, прошедшие с начала эпохи Unix, и конкатенирует их в шестнадцатиричном представлении:
function uniqid(): string
{
$time = gettimeofday();
return sprintf('%x%x', $time['sec'], $time['usec']);
}
Таким образом, выдаваемая строка имеет длину 13 символов (как посчитать длину самому). Если требуется меньше, то отрезать нужно с конца, так как наибольшей энтропией обладают последние знаки. Например, чтобы получить 8 символов, используем выражение
substr(uniqid(), -8).Первый необязательный параметр
$prefix эквивалентен конкатенации $prefix.uniqid().Второй необязательный параметр
$more_entropy добавляет к результату псевдослучайное число, что снижает риск получить одинаковые значения в параллельных процессах. Такая строка содержит 23 символа и имеет вид 61e0e81a580527.28156047.Не стоит относиться к этой функции слишком серьёзно, но в простейших случаях, например, при именовании каких-нибудь временных штук, она избавит вас от 🚲.
👍46💩34🔥7
Мы перешли на PHP 8.1 😝
Тут могла бы быть история про долгий и сложный переход, но мы просто апнулись одним праздничным днём, и всё...
За это, во-первых, спасибо инструментам статического анализа — с ними мы всегда уверены в forward-совместимости кода. А во-вторых — разработчикам PHP. Минорные и мажорные обновления стали плавными и качественными — большая часть депрекаций появляется и освещается в "СМИ" заранее, а откровенных багов стало очень мало.
Также порадовали зависимости:
Короче, полёт отличный, приглашаю обновиться. Если же пока нет такой возможности, обратите внимание на Rector. Через него можно делать бэкпорт, то есть писать на 8.1, а деплоить, например, 7.4. Сам не пробовал, если кто-то использует такую схему, расскажите про свой опыт, пожалуйста, в комментариях.
____________________
🔥 Кстати, я актуализировал вакансию и жду ваши резюме!
Тут могла бы быть история про долгий и сложный переход, но мы просто апнулись одним праздничным днём, и всё...
За это, во-первых, спасибо инструментам статического анализа — с ними мы всегда уверены в forward-совместимости кода. А во-вторых — разработчикам PHP. Минорные и мажорные обновления стали плавными и качественными — большая часть депрекаций появляется и освещается в "СМИ" заранее, а откровенных багов стало очень мало.
Также порадовали зависимости:
composer why-not php ^8.1 на нашем проекте быстро стал пустым. Видимо, авторы большинства пакетов ещё в прошлый раз в require поставили ...|^8.0, поэтому к 8.1 они уже были готовы.Короче, полёт отличный, приглашаю обновиться. Если же пока нет такой возможности, обратите внимание на Rector. Через него можно делать бэкпорт, то есть писать на 8.1, а деплоить, например, 7.4. Сам не пробовал, если кто-то использует такую схему, расскажите про свой опыт, пожалуйста, в комментариях.
____________________
🔥 Кстати, я актуализировал вакансию и жду ваши резюме!
Telegram
Пых
Ищу к себе в команду middle/senior разработчика!
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без…
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без…
🔥35👍16
This media is not supported in your browser
VIEW IN TELEGRAM
Лето 2016-ого, «Территория Смыслов». 😅
🔥33👍5👎1
Поиск по нескольким словам в проекте
Задача. Найти в проекте все файлы, в которых есть слова
Пишите в комментариях, как вы бы решали эту задачу. Я расскажу, как найти файлы с использованием поиска по регулярному выражению в PhpStorm.
В RegEx можно по-разному обозначить подстроку, но только lookahead и lookbehind позволяют комбинировать условия без определённого порядка. Получается следующий паттерн:
Однако в таком виде в PhpStorm паттерн не сработает, потому что в интерпертации IDE
Паттерн легко расширяется для поиска любого кол-ва слов.
Источники:
• https://stackoverflow.com/a/4389683,
• https://bit.ly/3LeMPa9.
Задача. Найти в проекте все файлы, в которых есть слова
employee и department (обязательно оба в любом порядке).Пишите в комментариях, как вы бы решали эту задачу. Я расскажу, как найти файлы с использованием поиска по регулярному выражению в PhpStorm.
В RegEx можно по-разному обозначить подстроку, но только lookahead и lookbehind позволяют комбинировать условия без определённого порядка. Получается следующий паттерн:
^(?=.*\bemployee\b)(?=.*\bdepartment\b).*$
(?=) — positive lookahead, \b — граница слова, .* — любой символ.Однако в таком виде в PhpStorm паттерн не сработает, потому что в интерпертации IDE
. не включает символ новой строки. Поэтому заменяем . на [\s\S] (любой пробельный или непробельный символ) и получаем рабочий шаблон:
^(?=[\s\S]*\bemployee\b)(?=[\s\S]*\bdepartment\b)[\s\S]*$
Паттерн легко расширяется для поиска любого кол-ва слов.
Источники:
• https://stackoverflow.com/a/4389683,
• https://bit.ly/3LeMPa9.
👍70🔥6
3000+ PHP developers cannot be wrong
Завтра вместе с Александром Макаровым и Кириллом Несмеяновым подведём итоги 2021 года на стриме!
Разыграем кучу подарков, в том числе бесплатную часовую консультацию со мной. 🎁
Начало в 11 по Москве.
https://phpcommunity.ru/2021-php
Завтра вместе с Александром Макаровым и Кириллом Несмеяновым подведём итоги 2021 года на стриме!
Разыграем кучу подарков, в том числе бесплатную часовую консультацию со мной. 🎁
Начало в 11 по Москве.
https://phpcommunity.ru/2021-php
YouTube
Чем запомнился 2021 год русскоязычному PHP-сообществу — в 3000+ ответах
Подробнее https://phpcommunity.ru/2021-php
В PHP-сообществе прошел второй ежегодный опрос. Обсудим итоги в лайве: на какой версии сидит сообщество и многие ли переехали на восьмерку (или даже на 8.1), расклад по фреймворкам, главные события 2021, планы…
В PHP-сообществе прошел второй ежегодный опрос. Обсудим итоги в лайве: на какой версии сидит сообщество и многие ли переехали на восьмерку (или даже на 8.1), расклад по фреймворкам, главные события 2021, планы…
🔥35👍15
🔴 И мы нааачииинаааееем, заходите!
https://youtu.be/Nx39a7n9KIQ
Полезные ссылки:
• Итоги 2021 для PHP-коммьюнити в цифрах и графиках,
• Что смотрели и читали по PHP в 2021: список от сообщества.
https://youtu.be/Nx39a7n9KIQ
Полезные ссылки:
• Итоги 2021 для PHP-коммьюнити в цифрах и графиках,
• Что смотрели и читали по PHP в 2021: список от сообщества.
YouTube
Чем запомнился 2021 год русскоязычному PHP-сообществу — в 3000+ ответах
Подробнее https://phpcommunity.ru/2021-php
В PHP-сообществе прошел второй ежегодный опрос. Обсудим итоги в лайве: на какой версии сидит сообщество и многие ли переехали на восьмерку (или даже на 8.1), расклад по фреймворкам, главные события 2021, планы…
В PHP-сообществе прошел второй ежегодный опрос. Обсудим итоги в лайве: на какой версии сидит сообщество и многие ли переехали на восьмерку (или даже на 8.1), расклад по фреймворкам, главные события 2021, планы…
🔥11👍3
🤝 PHP Foundation
С этого дня я ежемесячно перевожу $50 в фонд PHP.
PHP Foundation — это некоммерческая организация, миссия которой — обеспечить долгосрочное развитие PHP. Главный идеолог фонда — Роман Пронский, автор PHP Digest. Запуск проекта стал совместной инициативой JetBrains, Laravel, Symfony, Zend и других компаний.
На текущий момент фонд обработал заявки от разработчиков, которые хотят участвовать в разработке языка, и теперь решает юридические вопросы. Поэтому в графе расходов пока пусто — полноценная работа начнётся после согласования документов. Подробнее читайте в первом апдейте.
Больше о фонде:
• 216-ый выпуск PHP Дайджеста,
• стрим к выходу PHP 8.1,
• блог JetBrains,
• Twitter проекта.
https://opencollective.com/phpfoundation
С этого дня я ежемесячно перевожу $50 в фонд PHP.
PHP Foundation — это некоммерческая организация, миссия которой — обеспечить долгосрочное развитие PHP. Главный идеолог фонда — Роман Пронский, автор PHP Digest. Запуск проекта стал совместной инициативой JetBrains, Laravel, Symfony, Zend и других компаний.
На текущий момент фонд обработал заявки от разработчиков, которые хотят участвовать в разработке языка, и теперь решает юридические вопросы. Поэтому в графе расходов пока пусто — полноценная работа начнётся после согласования документов. Подробнее читайте в первом апдейте.
Больше о фонде:
• 216-ый выпуск PHP Дайджеста,
• стрим к выходу PHP 8.1,
• блог JetBrains,
• Twitter проекта.
https://opencollective.com/phpfoundation
👍69🔥23💩2
fromName для enum
Перечисления (енамы) бывают двух типов: чистые игрязные типизированные, со скалярным эквивалентом. Типизированные енамы реализуют интерфейс BackedEnum с дополнительными методами
В этом посте мы попробуем добавить аналогичные методы
Для начала обратим внимание на любопытную фразу в документации: "Для вариантов перечисления применяются те же правила синтаксиса, что и для любой метки в PHP, смотрите Константы". По идее, это означает, что мы можем без рефлексии динамически работать с енамами как с константами. Попробуем!
Вуаля, работает! https://3v4l.org/EgBB1
Обратите внимание на комментарии @SerafimArts про нюансы использования констант и решение задачи через рефлексию.
P.S.: Задача этого поста — поиграться с перечислениями, чтобы лучше их прочувствовать. Я не призываю так делать. Если при работе с чистым енамом выясняется, что его нужно получать по имени, то лучше поменять такой енам на типизированный и использовать встроенные методы
Перечисления (енамы) бывают двух типов: чистые и
from и tryFrom — они позволяют получить перечисление по его скалярному эквиваленту ($value).В этом посте мы попробуем добавить аналогичные методы
fromName и tryFromName для получения перечисления любого типа по его имени ($name).Для начала обратим внимание на любопытную фразу в документации: "Для вариантов перечисления применяются те же правила синтаксиса, что и для любой метки в PHP, смотрите Константы". По идее, это означает, что мы можем без рефлексии динамически работать с енамами как с константами. Попробуем!
enum Locale
{
case ru;
case en;
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,
));
}
}
Вуаля, работает! 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.
👍27🔥7
Ушла из жизни Юлия Insolita
Юлия — самая активная участница русского PHP-сообщества. Она контрибьютила в Open Source, возглавляла сообщество Иркутска в Telegram, помогала Роме с дайджестами, комментировала каждый стрим.
По-итальянски insolita означает "необычная", "необыкновенная". Такой Юля и была, такой мы её и запомним.
В память о Юлии предлагаю полистать её блоги на dev.to и medium.
Юлия — самая активная участница русского PHP-сообщества. Она контрибьютила в Open Source, возглавляла сообщество Иркутска в Telegram, помогала Роме с дайджестами, комментировала каждый стрим.
По-итальянски insolita означает "необычная", "необыкновенная". Такой Юля и была, такой мы её и запомним.
В память о Юлии предлагаю полистать её блоги на dev.to и medium.
😢179👍3
Какой стиль именования лучше всего подходит для кейсов enum?
Anonymous Poll
29%
camelCase
15%
PascalCase
4%
snake_case
51%
SCREAMING_SNAKE_CASE
💩16👍3🔥3
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,
);
💩27🔥7👍6
🤝 Встреча с программным комитетом PHP Russia 2022
• У меня есть тема, но я не решаюсь выступить.
• Я выступил на митапе, но не уверен, что мой доклад подходит для конференции.
• Однажды я подал доклад, но его отклонили, больше не хочу.
• Я хотел бы выступить, но, кажется, в нашем высоконагруженном проекте с тремя фреймворками, пятью видами БД, сотней микросервисов и кубернетесом нет ничего интересного.
Пыхарь, если при упоминании слова "конференция" у тебя проносятся такие мысли, то это замечательно, потому что ты без пяти минут докладчик! Мы ждём тебя сегодня в 19:00, чтобы вдохновить, помочь и направить. Буду рад стать твоим ментором и выступить бок о бок в сентябре!
Подробности в канале конференции: https://t.me/PHPRussiaConfChannel/295.
• У меня есть тема, но я не решаюсь выступить.
• Я выступил на митапе, но не уверен, что мой доклад подходит для конференции.
• Однажды я подал доклад, но его отклонили, больше не хочу.
• Я хотел бы выступить, но, кажется, в нашем высоконагруженном проекте с тремя фреймворками, пятью видами БД, сотней микросервисов и кубернетесом нет ничего интересного.
Пыхарь, если при упоминании слова "конференция" у тебя проносятся такие мысли, то это замечательно, потому что ты без пяти минут докладчик! Мы ждём тебя сегодня в 19:00, чтобы вдохновить, помочь и направить. Буду рад стать твоим ментором и выступить бок о бок в сентябре!
Подробности в канале конференции: https://t.me/PHPRussiaConfChannel/295.
Telegram
PHP Russia Channel
Всем привет,
21 апреля в 19:00 приглашаем на онлайн-встречу с Программным комитетом PHP Russia.
Мы принимаем доклады до 25 мая - остается всего месяц, поэтому в четверг расскажем:
- про тематические секции,
- какие заявки проходят в программу,
-…
21 апреля в 19:00 приглашаем на онлайн-встречу с Программным комитетом PHP Russia.
Мы принимаем доклады до 25 мая - остается всего месяц, поэтому в четверг расскажем:
- про тематические секции,
- какие заявки проходят в программу,
-…
👍27💩25🔥7👎2
📺 Очень крутая серия видео про дженерики в PHP от Brent Roose, смотрится легко и быстро.
https://youtube.com/playlist?list=PL0bgkxUS9EaKyOugEDffRzsvupBE2YEoD
https://youtube.com/playlist?list=PL0bgkxUS9EaKyOugEDffRzsvupBE2YEoD
YouTube
Generics in PHP
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.
🔥32
🤯 Перестань не использовать функции в PHP!
Функции??? Да! Те самые функции, которые когда-то все спокойно юзали, но которые позже заменили класс-ориентированным программированием с неймингом вида
Функция — это никакой не code smell, а удобная конструкция процедурного программирования, которую не стоит избегать и недооценивать. Если ты считаешь наоборот, я попробую тебя переубедить!
Сначала разберём два традиционных замечания к функциям. Во-первых, в PHP для функций не предусмотрен автолоадинг. Да, файлы с функциями нужно явно прописывать в autoload.files, они будут загружаться на каждом хите. Однако, этот оверхед пренебрежим в случае "умирающего" PHP и отстутствует вообще, если используется preloading или PHP "не умирает". Поэтому тут в минусы запишем только возню с
Во-вторых, функции нельзя мокать. Это традиционное мокистское заявление, на которое почти всегда можно ответить: "Так не мокай!" и послать к Фаулеру. Функция — это имплементация, а не интерфейс. "Интерфейс" функции
А вот плюсов я насчитал куда больше!
➕Функции идеально подходят для операций, не требующих организации состояния. Согласитесь, класс с приватным конструктором без состояния — этокастрат костыль.
➕Декларация функции, очевидно, лаконичнее декларации класса.
➕В один файл можно положить несколько функций, это не нарушает стандарты. При этом название файла не должно соответствовать имени функции.
➕Так же, как и классы, функции могут быть определены в неймспейсе, ничто не мешает вам объявить свои функции для каждого модуля.
➕Функция лаконичнее выглядит в вызывающем коде:
Критерии хорошей функции всё те же: низкая цикломатическая сложность, небольшое количество параметров, SRP. Если функцию "раздуло", то либо её надо разбить на несколько функций с разными именами, либо задачу всё-таки надо решать с использованием классов.
Вот несколько функций из нашего проекта: https://gist.github.com/vudaltsov/eb53927894cb467588e67352e2d8f1d9.
И напоследок статья Никиты Попова, которая несколько лет назад могла мне поменять отношение к функциям: https://www.npopov.com/2012/08/10/Are-PHP-developers-functophobic.html.
Пиши в комментариях, используешь ли ты функции или нет и почему.
Функции??? Да! Те самые функции, которые когда-то все спокойно юзали, но которые позже заменили класс-ориентированным программированием с неймингом вида
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.
Пиши в комментариях, используешь ли ты функции или нет и почему.
👍66👎37🔥9
📈 Выборочная оптимизация на примере Composer 2.2
Рекомендую январский выпуск Пятиминутки PHP, в котором Пётр разобрался, как разработчики ускорили Composer, и поставил под сомнение их результат.
Однако в этом посте я хочу поговорить не про результат, а про подход. Он называется выборочной оптимизацией: подпрограмму улучшают не целиком, а только для конкретных случаев. Попробую обобщить и формализовать такой метод:
1. Исследуем очередное узкое горлышко в программе.
2. Ищем предпосылку, при которой можно можно провести оптимизацию подпрограммы.
3. Выдвигаем гипотезу о том, что при использовании программы предпосылка выполняется достаточно часто.
4. В случае подтверждения гипотезы, проводим оптимизацию для этой предпосылки.
Здесь важен баланс между стоимостью оптимизации (затраты на внедрение, прирост сложности кода) и профитом от неё (изменение целевых метрик, доля улучшенных сценариев). Иными словами, игра должна стоить свеч.
https://5minphp.ru/episode95/
Рекомендую январский выпуск Пятиминутки PHP, в котором Пётр разобрался, как разработчики ускорили Composer, и поставил под сомнение их результат.
Однако в этом посте я хочу поговорить не про результат, а про подход. Он называется выборочной оптимизацией: подпрограмму улучшают не целиком, а только для конкретных случаев. Попробую обобщить и формализовать такой метод:
1. Исследуем очередное узкое горлышко в программе.
2. Ищем предпосылку, при которой можно можно провести оптимизацию подпрограммы.
3. Выдвигаем гипотезу о том, что при использовании программы предпосылка выполняется достаточно часто.
4. В случае подтверждения гипотезы, проводим оптимизацию для этой предпосылки.
Здесь важен баланс между стоимостью оптимизации (затраты на внедрение, прирост сложности кода) и профитом от неё (изменение целевых метрик, доля улучшенных сценариев). Иными словами, игра должна стоить свеч.
https://5minphp.ru/episode95/
Пятиминутка PHP
Оптимизация производительности в Composer 2.2
В декабре 2021 года вышло обновление пакетного менеджера Composer, версия 2.2. Заявлено увеличение производительност в некоторых случаях на 90%. Как это возможно и почему Composer раньше …
🔥15👍7
Пыхарь, используешь ли ты мутационное тестирование?
Anonymous Poll
55%
Что?
38%
Слышал про такое, не пробовал.
3%
Использую только в pet-проектах.
2%
Пробовали на работе, не удалось внедрить. Сейчас в комментариях расскажу, почему.
2%
Успешно используем в рабочем проекте.
👍17
SuperJob о зарплатах PHP-разработчика в июне 2022 года
Информация для канала предоставлена пресс-службой SuperJob.
Программисты PHP в среднем зарабатывают в Москве 250 тыс. руб. в месяц, в Санкт-Петербурге — 210 тыс. руб., в Екатеринбурге и Ростове-на-Дону — по 200 тыс. руб. Наиболее востребованы специалисты с опытом разработки на PHP от 2 лет. Работодатели отдают предпочтение кандидатам с опытом работы с различными фреймворками, навыками рефакторинга чужого кода и unit-тестирования. Также востребован опыт проектирования и поддержки клиент-серверного API.
Минимальные зарплаты для кандидатов с опытом работы с PHP от полугода составляют 90-120 тыс. руб. в Москве, 80-100 тыс. руб. в Санкт-Петербурге и от 60/70-100 тыс. руб. в городах миллионниках. Чтобы претендовать на такую зарплату, кандидат должен знать теории баз данных и иметь опыт работы с СУБД, знать ООП, JavaScript, HTML и CSS, XM, а также уметь читать техническую документацию на английском языке.
При этом максимальные зарплатные предложения составляют 300-500 тыс. руб. в Москве, 250-420 тыс. в Санкт-Петербурге, до 350 тыс. руб. в Екатеринбурге, Ростове-на-Дону и Краснодаре — до 400 тыс. руб. в месяц, в Новосибирске — 380 тыс. и в Казани – 350 тыс. руб. в месяц.
Кстати по данным SuperJob, за год средние зарплатные предложения в IT-сфере выросли на 20,4%, а количество вакансий в IT за месяц увеличилось на 11%.
Подробнее и больше цифр: https://www.superjob.ru/research/articles/113508/programmist-php/
Информация для канала предоставлена пресс-службой SuperJob.
Программисты PHP в среднем зарабатывают в Москве 250 тыс. руб. в месяц, в Санкт-Петербурге — 210 тыс. руб., в Екатеринбурге и Ростове-на-Дону — по 200 тыс. руб. Наиболее востребованы специалисты с опытом разработки на PHP от 2 лет. Работодатели отдают предпочтение кандидатам с опытом работы с различными фреймворками, навыками рефакторинга чужого кода и unit-тестирования. Также востребован опыт проектирования и поддержки клиент-серверного API.
Минимальные зарплаты для кандидатов с опытом работы с PHP от полугода составляют 90-120 тыс. руб. в Москве, 80-100 тыс. руб. в Санкт-Петербурге и от 60/70-100 тыс. руб. в городах миллионниках. Чтобы претендовать на такую зарплату, кандидат должен знать теории баз данных и иметь опыт работы с СУБД, знать ООП, JavaScript, HTML и CSS, XM, а также уметь читать техническую документацию на английском языке.
При этом максимальные зарплатные предложения составляют 300-500 тыс. руб. в Москве, 250-420 тыс. в Санкт-Петербурге, до 350 тыс. руб. в Екатеринбурге, Ростове-на-Дону и Краснодаре — до 400 тыс. руб. в месяц, в Новосибирске — 380 тыс. и в Казани – 350 тыс. руб. в месяц.
Кстати по данным SuperJob, за год средние зарплатные предложения в IT-сфере выросли на 20,4%, а количество вакансий в IT за месяц увеличилось на 11%.
Подробнее и больше цифр: https://www.superjob.ru/research/articles/113508/programmist-php/
SuperJob.ru
Программист PHP - Исследовательский центр портала SuperJob.ru
Обзоры зарплат: Программист PHP
👍55👎10