Полезная задачка про
https://t.me/phpquiz/309
json_encode
в PHP 7.4 от меня на канале PHP задачи с собеседований.https://t.me/phpquiz/309
Telegram
PHP задачи с собеседований
Что выведет код?
Вспомнил, что ещё в декабре мы горячо обсуждали этот нюанс в чате @symfony_php.
В результате прений я сделал Pull Request, который привёл в соответствие поведение Symfony Serializer.
https://github.com/symfony/symfony/pull/34791
В результате прений я сделал Pull Request, который привёл в соответствие поведение Symfony Serializer.
https://github.com/symfony/symfony/pull/34791
GitHub
[Serializer] Skip uninitialized (PHP 7.4) properties in PropertyNormalizer and ObjectNormalizer by vudaltsov · Pull Request #34791…
Q
A
Branch?
3.4
Bug fix?
yes
New feature?
no
Deprecations?
no
Tickets
n/a
License
MIT
Doc PR
n/a
When trying to read from an uninitialized property in PHP 7.4, a TypeError is gen...
A
Branch?
3.4
Bug fix?
yes
New feature?
no
Deprecations?
no
Tickets
n/a
License
MIT
Doc PR
n/a
When trying to read from an uninitialized property in PHP 7.4, a TypeError is gen...
Какая у тебя ЗП в тысячах рублей?
Дудь, разлогинься 😂
Дудь, разлогинься 😂
Final Results
15%
<50
25%
50-100
21%
100-150
16%
150-200
9%
200-250
4%
250-300
2%
300-350
1%
350-400
1%
400-450
4%
>450
Ищу к себе в команду middle PHP-разработчика
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях. По-простому — собираем данные и строим отчёты. Но всё это приправлено многогранной бизнес-логикой, сложной авторизацией и прочими ноу-хау.
PHP 7.4 / Symfony 5.1 / PostgreSQL 12 / OpenAPI / CQRS / ES / DDD / Psalm на максималках и всё, о чём я тут рассказываю 😜
Full-time, Москва, БЦ Варшавка Sky, ЗП по результатам собеса.
https://happy-job.ru/vacancy-super-php-2020-10
Резюме можно присылать сразу мне @vudaltsov.
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях. По-простому — собираем данные и строим отчёты. Но всё это приправлено многогранной бизнес-логикой, сложной авторизацией и прочими ноу-хау.
PHP 7.4 / Symfony 5.1 / PostgreSQL 12 / OpenAPI / CQRS / ES / DDD / Psalm на максималках и всё, о чём я тут рассказываю 😜
Full-time, Москва, БЦ Варшавка Sky, ЗП по результатам собеса.
https://happy-job.ru/vacancy-super-php-2020-10
Резюме можно присылать сразу мне @vudaltsov.
Сегодня ребята в Пыхтелке активно обсуждают JWT vs Server Side Sessions, поддерживаю разговор мыслями и ссылками.
• Сессии — это абсолютно валидный, неустаревший подход. Не стоит переписывать аутентификацию из-за хайпа вокруг JWT.
• Сессии усложняют горизонтальное масштабирование, но так ли остро стоит этот вопрос в вашем проекте?
• Стандарт JWT действительно несовершенен, история помнит несколько серьёзных уязвимостей в его реализациях. Но в 2020 это не так актуально, просто проверьте, что вы обновили библиотеки.
• JWT не предусматривает простого механизма инвалидации токена. Либо придётся выставлять короткий Expiration Time, либо строить сложный statefull механизм для гибкого контроля выданных токенов.
• JWT удобен для организации временного ограниченного доступа к конкретным операциям/ресурсам: эндпойнтам API, файлам, действиям по ссылкам из персонализированных рассылок.
• Сессии — это абсолютно валидный, неустаревший подход. Не стоит переписывать аутентификацию из-за хайпа вокруг JWT.
• Сессии усложняют горизонтальное масштабирование, но так ли остро стоит этот вопрос в вашем проекте?
• Стандарт JWT действительно несовершенен, история помнит несколько серьёзных уязвимостей в его реализациях. Но в 2020 это не так актуально, просто проверьте, что вы обновили библиотеки.
• JWT не предусматривает простого механизма инвалидации токена. Либо придётся выставлять короткий Expiration Time, либо строить сложный statefull механизм для гибкого контроля выданных токенов.
• JWT удобен для организации временного ограниченного доступа к конкретным операциям/ресурсам: эндпойнтам API, файлам, действиям по ссылкам из персонализированных рассылок.
Несколько статей "за" и "против":
• https://medium.com/swlh/why-do-we-need-the-json-web-token-jwt-in-the-modern-web-8490a7284482,
• https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/,
• https://jolicode.com/blog/why-you-dont-need-jwt,
• https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid.
• https://medium.com/swlh/why-do-we-need-the-json-web-token-jwt-in-the-modern-web-8490a7284482,
• https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/,
• https://jolicode.com/blog/why-you-dont-need-jwt,
• https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid.
⚠️ Небольшое сообщение для тех, кто обновил Symfony до 4.4.14 / 5.1.6
Обратите внимание, что рядом с вашим
В соответствии с обновленным рецептом его нужно загитигнорить, а также добавить в исключения статических анализаторов во избежание ошибок, связанных с косвенным анализом классов
Спасибо @Taarim за наводку 😊
Обратите внимание, что рядом с вашим
src/Kernel.php
появился автогенерируемый файл .preload.php
(#38140, #38142, документация).В соответствии с обновленным рецептом его нужно загитигнорить, а также добавить в исключения статических анализаторов во избежание ошибок, связанных с косвенным анализом классов
vendor
через этот файл.Спасибо @Taarim за наводку 😊
Symfony
Symfony 4.4.14 released (Symfony Blog)
Symfony 4.4.14 has just been released.
Приглашаю всех на стрим о рефакторинге!
В четверг вечером я с Леонидом Корсаковым буду в прямом эфире "наперегонки" комментировать и рефакторить одну известную open source библиотеку. Посмотрим, что из этого выйдет 😅
1 октября / четверг / 19:00
Организаторы из Skyeng обещают призы 🎁:
🐘 фирменного PHP слона за лучшую зрительскую историю о рефакторинге,
🔑 несколько лицензий на PhpStorm за вопросы в эфире голосом!
https://www.youtube.com/watch?v=liMyAuxIoyM
В четверг вечером я с Леонидом Корсаковым буду в прямом эфире "наперегонки" комментировать и рефакторить одну известную open source библиотеку. Посмотрим, что из этого выйдет 😅
1 октября / четверг / 19:00
Организаторы из Skyeng обещают призы 🎁:
🐘 фирменного PHP слона за лучшую зрительскую историю о рефакторинге,
🔑 несколько лицензий на PhpStorm за вопросы в эфире голосом!
https://www.youtube.com/watch?v=liMyAuxIoyM
YouTube
Рефакторим c Александром Макаровым, Валентином Удальцовым, Валентином Назаровым, Леонидом Корсаковым
В четверг Александр Макаров (Yii) и Валентин Назаров (Skyeng) проведут стрим, на котором Валентин Удальцов (Пых) и Леонид Корсаков (PHP Kazan):
• посмотрят на код популярного гитхаб-проекта,
• найдут, что там порефакторить (и порефакторят),
• поделятся своими…
• посмотрят на код популярного гитхаб-проекта,
• найдут, что там порефакторить (и порефакторят),
• поделятся своими…
Подкаст { Между скобок } про статический анализ
На прошлой неделе Сергей Жук предложил мне обсудить статанализ, и я был бы не я, если бы упустил возможность ввернуть пару монологов про Psalm 😆
И вот о чём мы поговорили:
• почему PHP пошел в сторону строгой типизации,
• для чего нужны статические анализаторы и как они работают,
• будущее статических анализаторов.
https://soundcloud.com/between-braces/11-valentin-udaltsov-staticheskiy-analiz
На прошлой неделе Сергей Жук предложил мне обсудить статанализ, и я был бы не я, если бы упустил возможность ввернуть пару монологов про Psalm 😆
И вот о чём мы поговорили:
• почему PHP пошел в сторону строгой типизации,
• для чего нужны статические анализаторы и как они работают,
• будущее статических анализаторов.
https://soundcloud.com/between-braces/11-valentin-udaltsov-staticheskiy-analiz
Четверо в YouTube, не считая кота 🐈
Вчера у нас получился любопытный стрим про рефакторинг. Приятная компания, интересное задание и достойная организация. Спасибо всем, кто слушал, комментировал и потом писал в личку ✊
Вкратце для тех, кто ещё не посмотрел. Я поленился по-честному отрефакторить yiisoft/validator, вместо этого воспользовался лазейкой "мажорный релиз" и предложил альтернативную архитектуру для библиотеки 😅
Что у меня получилось: https://github.com/phpyh/validator.
Мои пояснения на вчерашнем стриме: https://youtu.be/liMyAuxIoyM?t=4308.
Вчера у нас получился любопытный стрим про рефакторинг. Приятная компания, интересное задание и достойная организация. Спасибо всем, кто слушал, комментировал и потом писал в личку ✊
Вкратце для тех, кто ещё не посмотрел. Я поленился по-честному отрефакторить yiisoft/validator, вместо этого воспользовался лазейкой "мажорный релиз" и предложил альтернативную архитектуру для библиотеки 😅
Что у меня получилось: https://github.com/phpyh/validator.
Мои пояснения на вчерашнем стриме: https://youtu.be/liMyAuxIoyM?t=4308.
⚠️ Команда Symfony снова шалит в патч-апдейте 4.4.15 / 5.1.7 😏
Если вы вносили правки, описанные мной в посте от 28 сентября, то придётся их откатить: удалить
После этого нужно добавить в репозиторий (без игнора) один из вариантов файла
Если у вас ядро располагается в нестандартном месте, то файл
Если вы вносили правки, описанные мной в посте от 28 сентября, то придётся их откатить: удалить
src/.preload.php
и убрать соответствующие правила из .gitignore
и конфигов инструментов.После этого нужно добавить в репозиторий (без игнора) один из вариантов файла
config/preload.php
из обновленного рецепта. В папку с конфигами у меня статанализ не ходит, поэтому на этот раз исключение добавлять не пришлось.Если у вас ядро располагается в нестандартном месте, то файл
var/cache/prod/App_KernelProdContainer.preload.php
будет называться иначе. Вот как получить верный путь:bin/console c:c --env=prod
find var/cache/prod -name '*.preload.php'
Symfony
Symfony 4.4.15 released (Symfony Blog)
Symfony 4.4.15 has just been released.
Ванлайнер для получения данных объекта без рефлексии
https://3v4l.org/adhBn
Что почитать на эту тему:
• документацию по Closure::call(),
• статью Accessing private PHP class members without reflection от @Ocramius.
https://3v4l.org/adhBn
Что почитать на эту тему:
• документацию по Closure::call(),
• статью Accessing private PHP class members without reflection от @Ocramius.
В преддверии новой самоизоляции хочу поделиться с вами роликом, который мы сделали в апреле, чтобы улыбнуть и улыбнуться 😊
Всем отличного настроения, несмотря ни на что!
🎶🥁💃🥭
https://www.youtube.com/watch?v=cyZ2bJ0rQQM
Всем отличного настроения, несмотря ни на что!
🎶🥁💃🥭
https://www.youtube.com/watch?v=cyZ2bJ0rQQM
YouTube
Zapekanka — Under Quarantine Funk
Функция для получения всех типов класса
Такая функция потребовалась мне для поиска обработчика объекта по типу. Генератор здесь позволяет не рефлексировать раньше времени.
https://3v4l.org/EOPjm
Такая функция потребовалась мне для поиска обработчика объекта по типу. Генератор здесь позволяет не рефлексировать раньше времени.
https://3v4l.org/EOPjm
Пых
Ванлайнер для получения данных объекта без рефлексии https://3v4l.org/adhBn Что почитать на эту тему: • документацию по Closure::call(), • статью Accessing private PHP class members without reflection от @Ocramius.
Выяснилось, что в предложенном мной виде функция objectToArray неуниверсальна ☹️
Для объекта встроенного класса (например,
"Встроенность" можно проверить через ReflectionClass::isInternal, а можно просто подавить ошибку и обработатьрелигии ситуации 😉
В чистом виде get_object_vars применима к любым объектам и всегда возвращает массив публичных нестатических свойств. У объектов встроенных классов кроме
Обновлённый вариант функции с рефлексией https://3v4l.org/2mtXC и без https://3v4l.org/RqDHu.
Для объекта встроенного класса (например,
DateTimeImmutable
или stdClass
) вызов Closure::call
бросит ошибку уровня E_WARNING
и вернёт null
, так как замыкание нельзя привязать к области видимости встроенного класса."Встроенность" можно проверить через ReflectionClass::isInternal, а можно просто подавить ошибку и обработать
null
, выбирайте по В чистом виде get_object_vars применима к любым объектам и всегда возвращает массив публичных нестатических свойств. У объектов встроенных классов кроме
stdClass
он, как правило, пустой.Обновлённый вариант функции с рефлексией https://3v4l.org/2mtXC и без https://3v4l.org/RqDHu.
Не игнорьте .idea в проекте
До сих пор встречаю проекты, где в
Представим, что каждый разработчик решил использовать свою IDE с уникальными временными файлами и предложил PR на изменение
Это элементарно достигается настройкой глобального
Всего лишь две команды в чек-лист вашего онбоардинга...
До сих пор встречаю проекты, где в
.gitignore
есть правила типа .idea/
, .vscode/
или *.swp
, поэтому решил написать этот пост.Представим, что каждый разработчик решил использовать свою IDE с уникальными временными файлами и предложил PR на изменение
.gitignore
. Думаю, проблема очевидна. Код должен быть IDE-агностик, то есть не зависеть от среды разработки.Это элементарно достигается настройкой глобального
.gitignore
на машине разработчика. Каждый прописывает себе те исключения, которые необходимы для его ОС, IDE и прочих инструментов, а затем спокойно открывает любой проект, не боясь закоммитить лишнее.Всего лишь две команды в чек-лист вашего онбоардинга...
git config --global core.excludesfile ~/.gitignore
echo '.idea/' >> ~/.gitignore
Уже месяц используем Composer 2 RC в продакшне, рекомендую!
Главное улучшение — это, конечно, превосходная скорость без всяких плагинов вроде
Понравилась возможность выполнить
Также меня заинтересовало, почему задепрекейтили мою любимую опцию
Подробно об изменениях:
• на русском https://sergeymukhin.com/blog/composer-2-chto-novogo-i-izmenennogo,
• на английском https://php.watch/articles/composer-2.
Главное улучшение — это, конечно, превосходная скорость без всяких плагинов вроде
hirak/prestissimo
или symfony/flex
.Понравилась возможность выполнить
composer require/remove <name> --dry-run
и безболезненно узнать, что изменится.Также меня заинтересовало, почему задепрекейтили мою любимую опцию
--no-suggest
. Пояснение "из уст" автора нашёл только в issue #8615: в новой версии предложения необъёмные и ненадоедливые.Подробно об изменениях:
• на русском https://sergeymukhin.com/blog/composer-2-chto-novogo-i-izmenennogo,
• на английском https://php.watch/articles/composer-2.
composer selfupdate --preview
Параметры vs Аргументы
Параметр — это переменная в сигнатуре функции. В PHP параметры характеризуются именем, типом, позицией, значением по умолчанию, вариативностью (
Аргумент — это выражение/значение, используемое при вызове функции.
Именно поэтому
На мой взгляд простой, но важный нюанс 👌
Параметр — это переменная в сигнатуре функции. В PHP параметры характеризуются именем, типом, позицией, значением по умолчанию, вариативностью (
...
) и возможностью передачи по ссылке (см. ReflectionParameter).Аргумент — это выражение/значение, используемое при вызове функции.
Именно поэтому
$reflectionMethod->getParameters()
, но func_get_args
и InvalidArgumentException
.На мой взгляд простой, но важный нюанс 👌