Как справедливо заметил в обсуждении @dimmount, есть еще четвёртый подход — Closure Table. Мы, кстати, тоже его используем, но я не знал, что это так называется 🙈
По сути, это денормализация материализованного пути в отдельную таблицу ancestor/descendant с заменой like на джойны и подзапросы, подробнее в статье другого автора.
https://habr.com/ru/post/193166/
По сути, это денормализация материализованного пути в отдельную таблицу ancestor/descendant с заменой like на джойны и подзапросы, подробнее в статье другого автора.
https://habr.com/ru/post/193166/
Хабр
Хранение деревьев в базе данных. Часть первая, теоретическая
Полгода назад написал бандл ClosureTable для фреймворка Laravel 3. Поводом для написания стала вот эта замечательная презентация Билла Карвина о способах хранени...
Теперь канал можно поддержать 💵 на Patreon
Для фона долго искал что-то с глубинным смыслом 😂
На всякий случай оставлю тут исходное изображение.
https://www.patreon.com/phpyh
Для фона долго искал что-то с глубинным смыслом 😂
На всякий случай оставлю тут исходное изображение.
https://www.patreon.com/phpyh
Patreon
Get more from Пых on Patreon
создаёт блог о разработке на PHP https://t.iss.one/phpyh
В PhpStorm наконец-то добавят поддержку Psalm и PHPStan 🎊
Предположительно, плагины войдут в релиз 2020.3, так что ждём сентябрьский EAP.
Впервые плагины оформлены в виде опенсорс-проектов на GitHub, так что мы можем наблюдать как на языке со статическим анализом реализуется поддержка внешнего статического анализа для языка без статического анализа 🤣 Если серьезно, то проекты можно использовать как эталоны для собственных плагинов.
Подробнее в блоге JetBrains: https://blog.jetbrains.com/phpstorm/2020/07/phpstan-and-psalm-support-coming-to-phpstorm/.
Как отчаянный псалмовец 😜 очень рад быть к этому причастным.
Во время карантина по просьбе @pronskiy записал для команды обзорный скринкаст по фичам Psalm.
Предположительно, плагины войдут в релиз 2020.3, так что ждём сентябрьский EAP.
Впервые плагины оформлены в виде опенсорс-проектов на GitHub, так что мы можем наблюдать как на языке со статическим анализом реализуется поддержка внешнего статического анализа для языка без статического анализа 🤣 Если серьезно, то проекты можно использовать как эталоны для собственных плагинов.
Подробнее в блоге JetBrains: https://blog.jetbrains.com/phpstorm/2020/07/phpstan-and-psalm-support-coming-to-phpstorm/.
Как отчаянный псалмовец 😜 очень рад быть к этому причастным.
Во время карантина по просьбе @pronskiy записал для команды обзорный скринкаст по фичам Psalm.
The JetBrains Blog
PHPStan and Psalm Support Coming to PhpStorm Soon | The PhpStorm Blog
The popular static analyzers PHPStan and Psalm will soon be supported in PhpStorm. Even better, the code behind this support will be open source.It’s always been possible to run PHPStan and Ps
Обработка deadlock в Doctrine
Проблему взаимных блокировок в первую очередь надо решать исходя из контекста, где они возникают. Однако если дедлоки стреляют изредка, можно предусмотреть простой retry. Удобнее всего его реализовать как middleware для command bus и там поймать
Помните, что после ошибки EntityManager закрывается. В Symfony его можно оживить вызовом метода
Пример такого middleware для Symfony Messenger: https://gist.github.com/vudaltsov/945291b4e8a8800f669d478c8d66e8b8
Проблему взаимных блокировок в первую очередь надо решать исходя из контекста, где они возникают. Однако если дедлоки стреляют изредка, можно предусмотреть простой retry. Удобнее всего его реализовать как middleware для command bus и там поймать
Doctrine\DBAL\Exception\RetryableException.Помните, что после ошибки EntityManager закрывается. В Symfony его можно оживить вызовом метода
resetManager() на сервисе @doctrine (автовайрится по интерфейсу Doctrine\Persistence\ManagerRegistry). После этого менеджер даже в извлеченном из контейнера сервисе не кинет The EntityManager is closed благодаря замене инициализатора в прокси.Пример такого middleware для Symfony Messenger: https://gist.github.com/vudaltsov/945291b4e8a8800f669d478c8d66e8b8
Gist
DeadlockRetryMiddleware.php
GitHub Gist: instantly share code, notes, and snippets.
Спасибо @andrewDemb за ценное замечание: начиная с PHP 7.4 array_merge может принимать 0 аргументов.
https://3v4l.org/nUEs7
array_merge(...$arrays)https://3v4l.org/nUEs7
3v4l.org
Online PHP editor | output for nUEs7
Run your php code online; get statistics, vld output and compare output from all versions.
И ещё одно важное уточнение, спасибо @shmaltorhbooks.
Распаковать в аргументы можно только список (индексированный массив). На текущий момент даже Psalm это не проверяет. Соответственно, в общем случае массив массивов нужно привести списку массивов при помощи array_values.
Финальный вариант для PHP >= 7.4:
Для удобства эту конструкцию можно оформить в виде функции в проектном functions.php.
Так приятно, что комьюнити помогает 😊
Распаковать в аргументы можно только список (индексированный массив). На текущий момент даже Psalm это не проверяет. Соответственно, в общем случае массив массивов нужно привести списку массивов при помощи array_values.
Финальный вариант для PHP >= 7.4:
array_merge(...array_values($arrays)).Для удобства эту конструкцию можно оформить в виде функции в проектном functions.php.
/**
* @template T of array
* @psalm-param array<T> $arrays
* @psalm-return T
*/
function merge_arrays(array $arrays): array
{
return array_merge(...array_values($arrays));
}
Так приятно, что комьюнити помогает 😊
GitHub
Add error when unpacking an array of arguments with string keys · Issue #2481 · vimeo/psalm
Could psalm detect such cases? https://psalm.dev/r/5a1bf51bb9 https://3v4l.org/NNsi8 Note that arrays with integer keys (not lists) can be unpacked https://3v4l.org/ddAYG.
Если вам вдруг когда-нибудь потребуется найти/заменить символы перевода строки (
https://3v4l.org/5cBcW
\r, \n, \r\n), например для нормализации, можно воспользоваться малоизвестным классом \R.preg_replace('/\R/', PHP_EOL, "text\rwith\nvarious\r\nline endings\n\n")https://3v4l.org/5cBcW
3v4l.org
Online PHP editor | output for 5cBcW
Run your php code online; get statistics, vld output and compare output from all versions.
В обсуждении @ivan_tsirulev обратил внимание, что
• новую строку
• возврат каретки
• подачу страницы
• вертикальную табуляцию
Пример: https://3v4l.org/6QU82.
Список всех управляющих последовательностей в документации PHP: https://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.double.
Подробнее о поиске символов новой строки через регулярные выражения в статье Никиты Попова: https://nikic.github.io/2011/12/10/PCRE-and-newlines.html.
\R матчит более широкий спектр символов:• новую строку
\n,• возврат каретки
\r,• подачу страницы
\f,• вертикальную табуляцию
\v.Пример: https://3v4l.org/6QU82.
Список всех управляющих последовательностей в документации PHP: https://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.double.
Подробнее о поиске символов новой строки через регулярные выражения в статье Никиты Попова: https://nikic.github.io/2011/12/10/PCRE-and-newlines.html.
3v4l.org
Online PHP editor | output for 6QU82
Run your php code online; get statistics, vld output and compare output from all versions.
Открытое собеседование #1 🎊
Cтрим в четверг, 16 июля, в 17:00 по Москве/Киеву/Минску
Роман @phpdigest и я @phpyh совместно проведём открытое собеседование с Патриком Фельдешем.
Начнём со знакомства, перейдём к PHP, пробежимся по SOLID и закончим где-то в архитектуре и вопросами из чата. В конце расскажем, что было хорошо, а что не очень, и прошел ли бы кандидат реальное собеседование.
Трансляция будет на новом YouTube канале PHP Point — подписывайтесь, чтобы не пропустить следующие проекты 😉
https://www.youtube.com/watch?v=FQNd9W3nb3A
Cтрим в четверг, 16 июля, в 17:00 по Москве/Киеву/Минску
Роман @phpdigest и я @phpyh совместно проведём открытое собеседование с Патриком Фельдешем.
Начнём со знакомства, перейдём к PHP, пробежимся по SOLID и закончим где-то в архитектуре и вопросами из чата. В конце расскажем, что было хорошо, а что не очень, и прошел ли бы кандидат реальное собеседование.
Трансляция будет на новом YouTube канале PHP Point — подписывайтесь, чтобы не пропустить следующие проекты 😉
https://www.youtube.com/watch?v=FQNd9W3nb3A
YouTube
Открытое собеседование PHP Point #1 / Валентин Удальцов vs Патрик Фельдеш
О Патрике: https://career.habr.com/sspat
Код для ревью: https://gist.github.com/vudaltsov/e6f7dd83a88b349cd5ee0e0d1795e5aa
Задача на SQL: https://gist.github.com/vudaltsov/e3d06ef2158a248337aa262a9fb60b5f
Большое спасибо Антону Мореву за помощь с трансляцией.…
Код для ревью: https://gist.github.com/vudaltsov/e6f7dd83a88b349cd5ee0e0d1795e5aa
Задача на SQL: https://gist.github.com/vudaltsov/e3d06ef2158a248337aa262a9fb60b5f
Большое спасибо Антону Мореву за помощь с трансляцией.…
Мы начинаем открытое собеседование! Присоединяйтесь!
Update: Cтрим закончился, по ссылке запись. Код для ревью и задача по SQL в описании под видео.
https://www.youtube.com/watch?v=FQNd9W3nb3A
Update: Cтрим закончился, по ссылке запись. Код для ревью и задача по SQL в описании под видео.
https://www.youtube.com/watch?v=FQNd9W3nb3A
YouTube
Открытое собеседование PHP Point #1 / Валентин Удальцов vs Патрик Фельдеш
О Патрике: https://career.habr.com/sspat
Код для ревью: https://gist.github.com/vudaltsov/e6f7dd83a88b349cd5ee0e0d1795e5aa
Задача на SQL: https://gist.github.com/vudaltsov/e3d06ef2158a248337aa262a9fb60b5f
Большое спасибо Антону Мореву за помощь с трансляцией.…
Код для ревью: https://gist.github.com/vudaltsov/e6f7dd83a88b349cd5ee0e0d1795e5aa
Задача на SQL: https://gist.github.com/vudaltsov/e3d06ef2158a248337aa262a9fb60b5f
Большое спасибо Антону Мореву за помощь с трансляцией.…
Понравилась статья Null is your friend, not a mistake.
Главный тезис: сама по себе концепция null не является ошибкой (в миллиард долларов), ошибочна система типов Java, которая считает null частью любого типа.
Для понимания. В PHP у нас с этим всё хорошо 😳: мы явно помечаем тип
https://medium.com/@elizarov/null-is-your-friend-not-a-mistake-b63ff1751dd5
За статью спасибо @Enleur.
Главный тезис: сама по себе концепция null не является ошибкой (в миллиард долларов), ошибочна система типов Java, которая считает null частью любого типа.
Для понимания. В PHP у нас с этим всё хорошо 😳: мы явно помечаем тип
X как nullable при помощи символа вопроса ?X. В Java такого нет, переменная типа X может иметь значение X или null. Поэтому у новичков (которые не выбрали Kotlin) часто проблемы с NullPointerException, а в коде на Java присутствуют костыли @Nullable и @NotNull и/или "избыточные" проверки null != $obj.https://medium.com/@elizarov/null-is-your-friend-not-a-mistake-b63ff1751dd5
За статью спасибо @Enleur.
Medium
Null is your friend, not a mistake
NullPointerException is dreaded in Java. All sorts of workarounds exist to avoid nulls. Fear not. They are not needed with Kotlin.
Эффективно игнорим исключения в Psalm
Вчера счастью моему не было предела, когда в https://github.com/vimeo/psalm/issues/3286 через 3 месяца мне ответили, что в
Игнорить следует unchecked исключения (подклассы
Кстати, в PhpStorm в разделе Preferences > Languages & Frameworks > PHP тоже можно указывать, какие исключения считать unchecked.
Вчера счастью моему не было предела, когда в https://github.com/vimeo/psalm/issues/3286 через 3 месяца мне ответили, что в
psalm.xml в разделе <ignoreExceptions> есть незадокументированный тег <classAndDescendants>. При помощи него уже давным давно можно игнорить исключение и все его подклассы. На скрине до и после 🤣Игнорить следует unchecked исключения (подклассы
RuntimeException, LogicException и Error). Ну и иногда можно позволить себе игнорить некоторые checked, чтобы не захламлять проект бесконечными @throws, которые едва ли можно как-то обработать.Кстати, в PhpStorm в разделе Preferences > Languages & Frameworks > PHP тоже можно указывать, какие исключения считать unchecked.
Если вы достаточно хорошо знаете английский, советую вот это выступление Дяди Боба.
Отличный стендап для буднего вечера 😅
https://www.youtube.com/watch?v=QHnLmvDxGTY
Отличный стендап для буднего вечера 😅
https://www.youtube.com/watch?v=QHnLmvDxGTY
YouTube
"Uncle" Bob Martin
Software luminary “Uncle Bob” Martin spoke to members of the Yale and New Haven communities at Yale School of Management. Martin had been a professional programmer since 1970; since then he has become a prolific author and leader in the industry.
Dan Bernier…
Dan Bernier…
Поиск и устранение утечек памяти в PHP с разбором реального примера
29 июля, в эту среду, в 18:00 я проведу стрим на канале PHP Point.
Примерный план:
• поговорим о видах утечек и инструментах для их поиска;
• установим один проблемный компонент Symfony и найдём в нём утечку;
• запилим быстрый фикс для проекта при помощи Compiler Pass;
• если успеем, сделаем Pull Request в репозиторий Symfony.
https://www.youtube.com/watch?v=NNMp-97rk9c
29 июля, в эту среду, в 18:00 я проведу стрим на канале PHP Point.
Примерный план:
• поговорим о видах утечек и инструментах для их поиска;
• установим один проблемный компонент Symfony и найдём в нём утечку;
• запилим быстрый фикс для проекта при помощи Compiler Pass;
• если успеем, сделаем Pull Request в репозиторий Symfony.
https://www.youtube.com/watch?v=NNMp-97rk9c
YouTube
Поиск и устранение утечек памяти в PHP / Валентин Удальцов
00:00:00 Приветствие
00:02:16 Обзор утечек памяти в PHP
00:06:38 ProgressBar Symfony Console для контроля расхода памяти в консольных командах
00:11:27 MemoryInterrupter для контроля расхода памяти в демонах
00:14:34 Нюанс про память в --env=dev при работе…
00:02:16 Обзор утечек памяти в PHP
00:06:38 ProgressBar Symfony Console для контроля расхода памяти в консольных командах
00:11:27 MemoryInterrupter для контроля расхода памяти в демонах
00:14:34 Нюанс про память в --env=dev при работе…
Forwarded from Галера Морева
#MoreView #13 | Валентин Удальцов – Автор канала "Пых" и ведущий разработчик в Happy Job
Продолжаю брать интервью у людей из мира PHP. На этот раз в гостях Валентин Удальцов. Я познакомился с ним в процессе организации онлайн-собеседования PHP разработчика. После предыдущего интервью с Дмитрием Елисеевым я понял что мне интересно еще поговорить про PHP и я сразу вспомнил про следующего гостя:)
В четверг в 17.00 поговорим про PHP, архитектуру, Пых, музыку и многое другое в онлайн формате. Приходите, задавайте вопросы и выигрывайте пиццу за лучший вопрос:)
Подробнее о выпуске: amorev.ru/moreview-13-valentin-udaltsov
Ссылка на трансляцию: youtu.be/LOrb3m0FQdU
Продолжаю брать интервью у людей из мира PHP. На этот раз в гостях Валентин Удальцов. Я познакомился с ним в процессе организации онлайн-собеседования PHP разработчика. После предыдущего интервью с Дмитрием Елисеевым я понял что мне интересно еще поговорить про PHP и я сразу вспомнил про следующего гостя:)
В четверг в 17.00 поговорим про PHP, архитектуру, Пых, музыку и многое другое в онлайн формате. Приходите, задавайте вопросы и выигрывайте пиццу за лучший вопрос:)
Подробнее о выпуске: amorev.ru/moreview-13-valentin-udaltsov
Ссылка на трансляцию: youtu.be/LOrb3m0FQdU
Как сделать тестируемым класс, использующий нечистую встроенную функцию PHP?
Очень просто — объявить функцию необязательным параметром конструктора.
Не советую использовать либы-костыли типа php-mock/php-mock.
Очень просто — объявить функцию необязательным параметром конструктора.
final class Service
{
/**
* @psalm-var callable(): int
*/
private $time;
/**
* @psalm-param ?callable(): int $time
*/
public function __construct(?callable $time = null)
{
$this->time = $time ?? 'time';
}
public function do(): void
{
$time = ($this->time)();
}
}
$service = new Service();
$serviceForTesting = new Service(static fn (): int => 1234567890);
Не советую использовать либы-костыли типа php-mock/php-mock.
Через 5 минут начинаю рассказывать про утечки памяти в PHP!
Присоединяйтесь, обсудим инструменты, лайфхаки и проанализируем реальный кейс.
https://www.youtube.com/watch?v=NNMp-97rk9c
Присоединяйтесь, обсудим инструменты, лайфхаки и проанализируем реальный кейс.
https://www.youtube.com/watch?v=NNMp-97rk9c
YouTube
Поиск и устранение утечек памяти в PHP / Валентин Удальцов
00:00:00 Приветствие
00:02:16 Обзор утечек памяти в PHP
00:06:38 ProgressBar Symfony Console для контроля расхода памяти в консольных командах
00:11:27 MemoryInterrupter для контроля расхода памяти в демонах
00:14:34 Нюанс про память в --env=dev при работе…
00:02:16 Обзор утечек памяти в PHP
00:06:38 ProgressBar Symfony Console для контроля расхода памяти в консольных командах
00:11:27 MemoryInterrupter для контроля расхода памяти в демонах
00:14:34 Нюанс про память в --env=dev при работе…
Через несколько минут я окажусь в гостях у Антона Морева на канале MoreView!
Буду ждать ваши каверзные вопросы 😅
По словам Антона, автор самого крутого вопроса получит 🍕
https://www.youtube.com/watch?v=LOrb3m0FQdU
Буду ждать ваши каверзные вопросы 😅
По словам Антона, автор самого крутого вопроса получит 🍕
https://www.youtube.com/watch?v=LOrb3m0FQdU
YouTube
MoreView #13 | Валентин Удальцов – Автор канала "Пых" и ведущий разработчик в Happy Job
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.