{"id":296219,"date":"2019-12-23T03:00:12","date_gmt":"2019-12-23T03:00:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=296219"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=296219","title":{"rendered":"PHP-\u0414\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u2116 170 (9 \u2013 23 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2019)"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/481564\/\"><a href=\"https:\/\/habr.com\/ru\/post\/481564\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fv\/6a\/lp\/fv6alpkkosreb_v_gbzckzugjra.jpeg\" width=\"600\"><\/div>\n<p><\/a>  <\/p>\n<p>\u0421\u0432\u0435\u0436\u0430\u044f \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b. \u0412 \u0432\u044b\u043f\u0443\u0441\u043a\u0435: CakePHP 4, Codeception 4, Phalcon 4 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u044b, \u043f\u043e\u0440\u0446\u0438\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0434\u043a\u0430\u0441\u0442\u044b, \u0432\u0438\u0434\u0435\u043e \u0441 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u043c\u0438\u0442\u0430\u043f\u043e\u0432, \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p>  \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f!<\/p>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h3><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/f57\/4e9\/991\/f574e9991c42407b8fa789a66b854f8d.png\" width=\"20\"> \u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u0438 \u0440\u0435\u043b\u0438\u0437\u044b<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/bakery.cakephp.org\/2019\/12\/15\/cakephp_400_released.html\" rel=\"nofollow\">CakePHP 4.0.0<\/a> \u2014 \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f PHP 7.2, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 PSR (3, 15, 16, 18) \u0438 <a href=\"https:\/\/book.cakephp.org\/4\/en\/appendices\/4-0-migration-guide.html\" rel=\"nofollow\">\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/a>, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0430<\/li>\n<li><a href=\"https:\/\/codeception.com\/12-18-2019\/codeception-4\" rel=\"nofollow\">Codeception 4.0<\/a> \u2014 \u041c\u043e\u0434\u0443\u043b\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Symfony 5, phpdotenv 4, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0430.<\/li>\n<li><a href=\"https:\/\/blog.phalcon.io\/post\/phalcon-4-0-0-released\" rel=\"nofollow\">Phalcon 4.0.0<\/a> \u2014 \u0420\u0435\u043b\u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f PHP. \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f PHP 7.2, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 PSR (7, 11, 13, 16, 17), \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0444\u0430\u0431\u0440\u0438\u043a\u0438. \u0411\u043e\u043b\u044c\u0448\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 <a href=\"https:\/\/docs.phalcon.io\/4.0\/en\/upgrade\" rel=\"nofollow\">\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043f\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e<\/a>.<\/li>\n<li><a href=\"https:\/\/xdebug.org\/announcements\/2019-12-09\" rel=\"nofollow\">Xdebug 2.9.0 <\/a> \u2014 \u0412 \u0440\u0435\u043b\u0438\u0437\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 2.5 \u0440\u0430\u0437\u0430 (\u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Xdebug 2.7). <a href=\"https:\/\/derickrethans.nl\/crafty-code-coverage.html\" rel=\"nofollow\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u0445<\/a>.<\/li>\n<li><a href=\"https:\/\/www.php.net\/ChangeLog-7.php#7.4.1\" rel=\"nofollow\">PHP 7.4.1<\/a><\/li>\n<li><a href=\"https:\/\/www.php.net\/ChangeLog-7.php#7.3.13\" rel=\"nofollow\">PHP 7.3.13<\/a><\/li>\n<li><a href=\"https:\/\/www.php.net\/ChangeLog-7.php#7.2.26\" rel=\"nofollow\">PHP 7.2.26<\/a> \u2014 \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0431\u0430\u0433\u0444\u0438\u043a\u0441-\u0440\u0435\u043b\u0438\u0437 \u0432\u0435\u0442\u043a\u0438. \u0415\u0449\u0451 \u0433\u043e\u0434 \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u0438 \u0432\u0441\u0451.<\/li>\n<li><a href=\"https:\/\/www.php-fig.org\/blog\/2019\/12\/new-bylaw-and-next-election-cycle\/\" rel=\"nofollow\">\u041d\u043e\u0432\u043e\u0441\u0442\u0438 PHP-FIG<\/a> \u2014 \u041e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e <a href=\"https:\/\/github.com\/php-fig\/fig-standards\/blob\/master\/bylaws\/008-psr-evolution.md\" rel=\"nofollow\">\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432<\/a>, \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0432\u044b\u0431\u043e\u0440\u0430\u0445 core-\u043a\u043e\u043c\u0438\u0442\u0435\u0442\u0430.<\/li>\n<li><a href=\"https:\/\/github.com\/skyeng\/php-communities\" rel=\"nofollow\">skyeng\/php-communities<\/a> \u2014 \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a PHP-\u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0441\u043f\u0438\u043a\u0435\u0440\u043e\u0432 \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432. \u0411\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u044f: <br \/>  \u2022 25 \u0434\u0435\u043a\u0430\u0431\u0440\u044f, \u041c\u043e\u0441\u043a\u0432\u0430: <a href=\"https:\/\/www.meetup.com\/ru-RU\/BeerPHP-Moscow\/events\/267315067\/\" rel=\"nofollow\">\u042e\u0431\u0438\u043b\u0435\u0439\u043d\u044b\u0439 BeerPHP<\/a> \u2014 <img decoding=\"async\" alt=\"habr\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/500\/4e4\/176\/5004e41767c539382d09c44e143f9bd6.png\"> <a href=\"https:\/\/habr.com\/ru\/company\/skyeng\/blog\/480484\/\">BeerPHP: \u0447\u0442\u043e \u044d\u0442\u043e, \u0437\u0430\u0447\u0435\u043c \u0438\u0434\u0442\u0438 \u0438 \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443 \u0441\u0435\u0431\u044f \u0432 \u0433\u043e\u0440\u043e\u0434\u0435<\/a>   <\/li>\n<\/ul>\n<p>  <\/p>\n<h3><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/cf8\/62d\/907\/cf862d9072784d04b621238ec137f2ca.png\" width=\"20\"> \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/DarkGhostHunter\/Preloader\" rel=\"nofollow\">DarkGhostHunter\/Preloader<\/a> \u2014 \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u043f\u043e\u0441\u0442\u0435 <img decoding=\"async\" alt=\"habr\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/500\/4e4\/176\/5004e41767c539382d09c44e143f9bd6.png\"> <a href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/480746\/\">Preload \u0432 php 7.4: Composer \u0438 \u0432\u044b\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/a>. <\/li>\n<li><a href=\"https:\/\/github.com\/munusphp\/munus\" rel=\"nofollow\">munusphp\/munus<\/a> \u2014 \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 PHP. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0438\u0437 Psalm.<\/li>\n<li><a href=\"https:\/\/github.com\/thecodingmachine\/safe\" rel=\"nofollow\">thecodingmachine\/safe 1.0.0<\/a> \u2014 \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 PHP, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0431\u0440\u043e\u0441\u0430\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f <code>false<\/code>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 <a href=\"https:\/\/thecodingmachine.io\/introducing-safe-php\" rel=\"nofollow\">\u043f\u043e\u0441\u0442\u0435<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/krakjoe\/pthreads\" rel=\"nofollow\">krakjoe\/pthreads<\/a> \u2014 \u043d\u0435\u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u0432 PHP \u0431\u044b\u043b\u043e \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/krakjoe\/parallel\" rel=\"nofollow\">krakjoe\/parallel<\/a>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/96b\/65e\/921\/96b65e92179a40f2bd1884549973ddd5.png\" width=\"16\"> Symfony<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/symfony.com\/blog\/a-week-of-symfony-677-16-22-december-2019\" rel=\"nofollow\">\u041d\u0435\u0434\u0435\u043b\u044f Symfony #677 (16-22 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2019)<\/a><\/li>\n<li><a href=\"http:\/\/assets.andreiabohner.org\/symfony\/sf44-messenger-cheat-sheet.pdf\" rel=\"nofollow\">\u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 Messenger<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h3><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/314\/bd0\/f0d\/314bd0f0dfc54e3fa7f0c0daef1a2d25.png\" width=\"16\"> Laravel<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/plugins.jetbrains.com\/plugin\/13441-laravel-idea\/\" rel=\"nofollow\">Laravel Idea<\/a> \u2014 \u041f\u043e\u0434 PhpStorm \u0434\u0430\u0432\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b Laravel \u043f\u043b\u0430\u0433\u0438\u043d, \u043d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e. \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 Laravel Idea, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043b\u0430\u0442\u043d\u044b\u0439, \u043d\u043e \u0437\u0430\u0442\u043e \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d. \u0410\u0432\u0442\u043e\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/adelf.tech\/\" rel=\"nofollow\">\u0410\u0434\u0435\u043b\u044c<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043f\u043b\u0430\u0433\u0438\u043d\u0443 <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/9525--env-files-support\" rel=\"nofollow\">.env files support<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u0440 \u043a\u043d\u0438\u0433\u0438 <a href=\"https:\/\/adelf.tech\/2019\/architecture-of-complex-web-applications\" rel=\"nofollow\">\u00abArchitecture of complex web applications\u00bb<\/a>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043e\u0431\u0437\u043e\u0440 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432 <img decoding=\"async\" alt=\"video\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/976\/d3e\/38a\/976d3e38a34b003f86f91795524af9f8.gif\"><img decoding=\"async\" alt=\"ru\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c72\/991\/4ca\/c729914ca9c21661c5abd81052c6a10e.gif\"> <a href=\"https:\/\/www.youtube.com\/watch?v=8klTJYhNo-A\" rel=\"nofollow\">\u0441\u043a\u0440\u0438\u043d\u043a\u0430\u0441\u0442\u0435<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/staudenmeir\/eloquent-has-many-deep\" rel=\"nofollow\">staudenmeir\/eloquent-has-many-deep<\/a> \u2014 \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f HasManyThrough, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. <img decoding=\"async\" alt=\"video\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/976\/d3e\/38a\/976d3e38a34b003f86f91795524af9f8.gif\"> <a href=\"https:\/\/www.youtube.com\/watch?v=wgdWokrm3Mw\" rel=\"nofollow\">\u0412\u0438\u0434\u0435\u043e<\/a>.<\/li>\n<li><a href=\"https:\/\/rubenvanassche.com\/getting-started-with-github-actions\/\" rel=\"nofollow\">\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 GitHub Actions \u0438 Laravel<\/a><\/li>\n<li><img decoding=\"async\" alt=\"ru\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c72\/991\/4ca\/c729914ca9c21661c5abd81052c6a10e.gif\"> <a href=\"https:\/\/laravel.demiart.ru\/oauth2-authentication-across-laravel-projects\/\" rel=\"nofollow\">\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f OAuth2 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 Laravel<\/a><\/li>\n<li><img decoding=\"async\" alt=\"video\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/976\/d3e\/38a\/976d3e38a34b003f86f91795524af9f8.gif\"> <a href=\"https:\/\/freek.dev\/1534-building-filters-using-laravel-query-builder\" rel=\"nofollow\">\u041f\u0438\u0448\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<\/a> <a href=\"https:\/\/github.com\/spatie\/laravel-query-builder\" rel=\"nofollow\">spatie\/laravel-query-builder<\/a><\/li>\n<li><img decoding=\"async\" alt=\"audio\" src=\"https:\/\/habrastorage.org\/webt\/d1\/ma\/lh\/d1malhabo7kf3wgh3xm03mcgdim.png\" width=\"12\"> \u041f\u043e\u0434\u043a\u0430\u0441\u0442 \u0422\u0435\u0439\u043b\u043e\u0440\u0430 <a href=\"https:\/\/blog.laravel.com\/laravel-snippet-19-laracon-viii-laravel-ui-passport-authentication\" rel=\"nofollow\">Laravel Snippet #19:<\/a> Laracon VIII, Laravel UI, Passport, Authentication.<\/li>\n<li><img decoding=\"async\" alt=\"audio\" src=\"https:\/\/habrastorage.org\/webt\/d1\/ma\/lh\/d1malhabo7kf3wgh3xm03mcgdim.png\" width=\"12\"> <a href=\"https:\/\/blog.laravel.com\/laravel-snippet-20-union-types-spa-authentication-laravel-ui-middleware-priority-laracon-2020\" rel=\"nofollow\">Laravel Snippet #20:<\/a> Union Types, SPA Authentication, Laravel UI, Middleware Priority, Laracon 2020.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/569\/de4\/298\/569de4298b764a33894aa517e74324f9.png\" width=\"16\"> Yii<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/yiiframework.ru\/news\/255\/yii-1-yii-2031-i-progress-v-yii-3\" rel=\"nofollow\">Yii 1, Yii 2.0.31 \u0438 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0432 Yii 3<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h3>Async PHP<\/h3>\n<p>  <\/p>\n<ul>\n<li><img decoding=\"async\" alt=\"video\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/976\/d3e\/38a\/976d3e38a34b003f86f91795524af9f8.gif\"> <a href=\"https:\/\/www.youtube.com\/watch?v=2-Id0dc1ZZk\" rel=\"nofollow\">\u0421\u043a\u0440\u0438\u043d\u043a\u0430\u0441\u0442 \u043f\u043e <\/a> <a href=\"https:\/\/github.com\/driftphp\" rel=\"nofollow\">DriftPHP<\/a> \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c\u0443 PHP-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 ReactPHP \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 Symfony.<\/li>\n<li><a href=\"https:\/\/github.com\/amphp\/http-client\" rel=\"nofollow\">amphp\/http-client 4.0.0<\/a> \u2014 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438\u0437 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 Amp. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 HTTP\/2 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 c PHP 7.4 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e <code>nghttp2<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 FFI.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/329\/bec\/7c1\/329bec7c1e914963a1c5d2f2bfe99995.png\" width=\"20\"> \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/stitcher.io\/blog\/php-in-2019\" rel=\"nofollow\">PHP \u0432 2019<\/a> \u2014 \u0422\u0440\u0435\u0437\u0432\u043e \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0434\u0435\u043b \u0432 PHP \u0441\u0435\u0433\u043e\u0434\u043d\u044f.<\/li>\n<li><a href=\"https:\/\/engineering.carsguide.com.au\/go-vs-php-syntax-comparison-c1465380b8ff\" rel=\"nofollow\">\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Go \u0438 PHP<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/index0h\/php-conventions\" rel=\"nofollow\">index0h\/php-conventions<\/a> \u2014 \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e PHP-\u043a\u043e\u0434\u0430 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c PSR.<\/li>\n<li><a href=\"https:\/\/github.com\/infection\/infection\/issues\/922\" rel=\"nofollow\">Extract Test Framework Adapter to separate composer packages<\/a> \u2014 \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u0437 <a href=\"https:\/\/github.com\/infection\/infection\" rel=\"nofollow\">Infection<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<li><a href=\"https:\/\/dev.to\/larapulse\/datastructures-in-php-4hkl\" rel=\"nofollow\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PHP<\/a> \u2014 \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431 SPL.<\/li>\n<li><a href=\"https:\/\/dev.to\/larapulse\/php-variables-under-the-hood-2onh\" rel=\"nofollow\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 PHP \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c<\/a> \u2014 \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e zval, \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u0438 \u043f\u0440\u043e\u0447\u0435\u043c.<\/li>\n<li><img decoding=\"async\" alt=\"habr\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/500\/4e4\/176\/5004e41767c539382d09c44e143f9bd6.png\"> <a href=\"https:\/\/habr.com\/ru\/company\/funcorp\/blog\/478760\/\">\u00ab\u041d\u0443\u043b\u0435\u0432\u043e\u0439\u00bb \u0430\u0434 \u0438 \u043a\u0430\u043a \u0438\u0437 \u043d\u0435\u0433\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c\u0441\u044f<\/a><\/li>\n<li><img decoding=\"async\" alt=\"habr\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/500\/4e4\/176\/5004e41767c539382d09c44e143f9bd6.png\"> <a href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/481092\/\">\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0432 PHP 8<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h3><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/8dc\/c23\/677\/8dcc236774104f8286a40ceaea553820.png\" width=\"20\"> \u0410\u0443\u0434\u0438\u043e\/\u0412\u0438\u0434\u0435\u043e<\/h3>\n<p>  <\/p>\n<ul>\n<li><img decoding=\"async\" alt=\"audio\" src=\"https:\/\/habrastorage.org\/webt\/d1\/ma\/lh\/d1malhabo7kf3wgh3xm03mcgdim.png\" width=\"12\"><img decoding=\"async\" alt=\"ru\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c72\/991\/4ca\/c729914ca9c21661c5abd81052c6a10e.gif\"> <a href=\"https:\/\/5minphp.ru\/episode74\/\" rel=\"nofollow\">\u041f\u044f\u0442\u0438\u043c\u0438\u043d\u0443\u0442\u043a\u0430 PHP \u2116 74: Laravel Vapor \u2014 \u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u044f<\/a><\/li>\n<li><img decoding=\"async\" alt=\"audio\" src=\"https:\/\/habrastorage.org\/webt\/d1\/ma\/lh\/d1malhabo7kf3wgh3xm03mcgdim.png\" width=\"12\"><img decoding=\"async\" alt=\"ru\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c72\/991\/4ca\/c729914ca9c21661c5abd81052c6a10e.gif\"> <a href=\"https:\/\/5minphp.ru\/episode75\/\" rel=\"nofollow\">\u041f\u044f\u0442\u0438\u043c\u0438\u043d\u0443\u0442\u043a\u0430 PHP \u2116 75<\/a> \u2014 C <a href=\"https:\/\/github.com\/tabuna\" rel=\"nofollow\">\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u043c \u0427\u0435\u0440\u043d\u044f\u0435\u0432\u044b\u043c<\/a> \u043f\u0440\u043e Laravel, \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 <a href=\"https:\/\/orchid.software\/\" rel=\"nofollow\">Laravel Orchid<\/a>.<\/li>\n<li><img decoding=\"async\" alt=\"audio\" src=\"https:\/\/habrastorage.org\/webt\/d1\/ma\/lh\/d1malhabo7kf3wgh3xm03mcgdim.png\" width=\"12\"> <a href=\"https:\/\/undercover-elephpant.com\/episodes\/retries-and-timeouts-with-bastian-hofmann\" rel=\"nofollow\">\u041f\u043e\u0434\u043a\u0430\u0441\u0442 The Undercover ElePHPant #4<\/a> \u2014 \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 <a href=\"https:\/\/twitter.com\/bastianhofmann\" rel=\"nofollow\">Bastian Hofmann<\/a>.<\/li>\n<li><img decoding=\"async\" alt=\"video\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/976\/d3e\/38a\/976d3e38a34b003f86f91795524af9f8.gif\"> <a href=\"https:\/\/www.youtube.com\/watch?v=ia1KSZCG2Bs\" rel=\"nofollow\">\u041a\u0430\u043a \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0434\u043e PHP 7.4 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e PhpStorm<\/a> \u2014 9 \u043c\u0438\u043d\u0443\u0442 <code>Alt+Enter<\/code> \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e <a href=\"https:\/\/www.jetbrains.com\/help\/phpstorm\/structural-search-and-replace.html\" rel=\"nofollow\">SSR<\/a>.<\/li>\n<li><img decoding=\"async\" alt=\"video\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/976\/d3e\/38a\/976d3e38a34b003f86f91795524af9f8.gif\"><img decoding=\"async\" alt=\"ru\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c72\/991\/4ca\/c729914ca9c21661c5abd81052c6a10e.gif\"> <a href=\"https:\/\/www.youtube.com\/watch?v=zZTv7HMxKXI\" rel=\"nofollow\">\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0430\u0437\u0430\u043d\u0441\u043a\u0438\u0439 PHP-\u043c\u0438\u0442\u0430\u043f<\/a><\/li>\n<li><img decoding=\"async\" alt=\"video\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/976\/d3e\/38a\/976d3e38a34b003f86f91795524af9f8.gif\"><img decoding=\"async\" alt=\"ru\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c72\/991\/4ca\/c729914ca9c21661c5abd81052c6a10e.gif\"> <a href=\"https:\/\/www.youtube.com\/watch?v=tJvLJ_G2PEc\" rel=\"nofollow\">\u0412\u0442\u043e\u0440\u043e\u0439 \u043d\u0438\u0436\u0435\u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u0439 PHP-\u043c\u0438\u0442\u0430\u043f<\/a><\/li>\n<li><img decoding=\"async\" alt=\"video\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/976\/d3e\/38a\/976d3e38a34b003f86f91795524af9f8.gif\"><img decoding=\"async\" alt=\"ru\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c72\/991\/4ca\/c729914ca9c21661c5abd81052c6a10e.gif\"> <a href=\"https:\/\/www.youtube.com\/playlist?list=PLx2IchnH8dHg3GAbndnIZPkZm5Td-9csk\" rel=\"nofollow\">Onliner PHP Meetup #5<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h3><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/cc2\/4d9\/c95\/cc24d9c95c9841988f8299a8b285e6f6.png\" width=\"20\"> \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/www.reddit.com\/r\/PHP\/comments\/e9odl3\/small_things_missing_in_php\/\" rel=\"nofollow\">\u041a\u0430\u043a\u0438\u0445 \u043c\u0435\u043b\u043e\u0447\u0435\u0439 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432 PHP?<\/a> \u2014 \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0435\u0434 \u043e\u0442 \u041d\u0438\u043a\u0438\u0442\u044b \u041f\u043e\u043f\u043e\u0432\u0430 \u043d\u0430 Reddit. \u041c\u043d\u043e\u0433\u0438\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0430\u0445, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0449\u0438\u043d\u0435 \u0438 \u0442.\u043f. \u0410 \u0435\u0441\u0442\u044c \u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u0448\u0442\u0443\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442? <br \/>  \u0422\u0430\u043a\u0436\u0435 \u0432 \u0442\u0440\u0435\u0434\u0435 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u041d\u0438\u043a\u0438\u0442\u044b, <a href=\"https:\/\/www.reddit.com\/r\/PHP\/comments\/e9odl3\/small_things_missing_in_php\/fakbx6d\/?context=8&amp;depth=9\" rel=\"nofollow\"><code>\u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u0442 \u0442\u0430\u0439\u043f\u0445\u0438\u043d\u0442\u0430 resource<\/code><\/a>.<\/li>\n<li>\u0410\u0432\u0442\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"https:\/\/github.com\/hoaproject\" rel=\"nofollow\">github.com\/hoaproject<\/a>, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u0446\u0435\u043b\u0430\u044f \u043f\u0430\u0447\u043a\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (\u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e 125\u043a \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0439 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e), <a href=\"https:\/\/twitter.com\/mnt_io\/status\/1206936893692219393\" rel=\"nofollow\">\u0440\u0430\u0437\u044b\u0441\u043a\u0438\u0432\u0430\u0435\u0442<\/a> \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0439\u043d\u0442\u0435\u043d\u0435\u0440\u0430.<\/li>\n<li>\u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0439 \u043c\u0438\u043d\u0438-\u0442\u0440\u0435\u0434 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043a\u043e\u0444\u0430\u0443\u043d\u0434\u0435\u0440\u043e\u0432 NPM. <br \/> \n<div class=\"oembed\">\n<blockquote class=\"twitter-tweet\" data-lang=\"en_US\">\n<p lang=\"en\" dir=\"ltr\">The last 10 years of web development have just been a long, slow walk back to the fantastic developer ergonomics and resilience of a PHP web app.<\/p>\n<p>\u2014 Laurie Voss (@seldo) <a href=\"https:\/\/twitter.com\/seldo\/status\/1205152990044180482?ref_src=twsrc%5Etfw\">December 12, 2019<\/a><\/p><\/blockquote>\n<p> <script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script> <\/div>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0443 \u0438\u043b\u0438 \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u2014 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432 <a href=\"https:\/\/habrahabr.ru\/conversations\/pronskiy\/\" rel=\"nofollow\">\u043b\u0438\u0447\u043a\u0443<\/a>.<br \/>  \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0438\u0448\u0438\u0442\u0435 \u043d\u0430 <a href=\"mailto:roman@pronskiy.com\">\u043f\u043e\u0447\u0442\u0443<\/a> \u0438\u043b\u0438 \u0432 <a href=\"https:\/\/twitter.com\/pronskiy\" rel=\"nofollow\">\u0442\u0432\u0438\u0442\u0442\u0435\u0440<\/a>.<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0432 Telegram-\u043a\u0430\u043d\u0430\u043b\u0435 <strong><a href=\"https:\/\/t.me\/phpdigest\" rel=\"nofollow\">PHP Digest<\/a><\/strong>.<\/p>\n<p>  <a href=\"https:\/\/bit.ly\/php-digest-add-link\" rel=\"nofollow\">\u041f\u0440\u0438\u0441\u043b\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443<\/a><br \/>   <a href=\"https:\/\/pronskiy.com\/php-digest\/\" rel=\"nofollow\">\u041f\u043e\u0438\u0441\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043f\u043e \u0432\u0441\u0435\u043c \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0430\u043c<\/a><br \/>   \u2190 <a href=\"https:\/\/habr.com\/ru\/post\/479306\/\">\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0432\u044b\u043f\u0443\u0441\u043a: PHP-\u0414\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u2116 169<\/a>  <\/p>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d() } } }t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>      <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/481564\/\"> https:\/\/habr.com\/ru\/post\/481564\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/481564\/\"><a href=\"https:\/\/habr.com\/ru\/post\/481564\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fv\/6a\/lp\/fv6alpkkosreb_v_gbzckzugjra.jpeg\" width=\"600\"><\/div>\n<p><\/a>  <\/p>\n<p>\u0421\u0432\u0435\u0436\u0430\u044f \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b. \u0412 \u0432\u044b\u043f\u0443\u0441\u043a\u0435: CakePHP 4, Codeception 4, Phalcon 4 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u044b, \u043f\u043e\u0440\u0446\u0438\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0434\u043a\u0430\u0441\u0442\u044b, \u0432\u0438\u0434\u0435\u043e \u0441 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u043c\u0438\u0442\u0430\u043f\u043e\u0432, \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p>  \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f!<\/p>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-296219","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/296219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=296219"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/296219\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=296219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=296219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=296219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}