{"id":314510,"date":"2020-12-08T09:01:00","date_gmt":"2020-12-08T09:01:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=314510"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=314510","title":{"rendered":"PhpStorm 2020.3: PHP 8, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, PHPStan \u0438 Psalm, Xdebug 3, Tailwind CSS \u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><a href=\"https:\/\/habr.com\/ru\/company\/JetBrains\/blog\/531828\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fu\/jm\/bn\/fujmbnjgazmhfzpbxmbzrusuefa.jpeg\"><\/a><\/p>\n<p>  \u0420\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0436\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 PhpStorm \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443! \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u043d\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<ul>\n<li><a href=\"#php8\">PHP 8<\/a>: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u0441\u0435\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 <a href=\"#phpstorm_attributes\">\u0448\u0442\u043e\u0440\u043c\u043e\u0432\u0441\u043a\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b<\/a>.<\/li>\n<li><a href=\"#psalm_and_phpstan\">PHPStan \u0438 Psalm<\/a> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<\/li>\n<li><a href=\"#xdebug\">Xdebug 3<\/a> \u0441 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439, \u0438 <a href=\"#debugger_improvements\">\u043d\u043e\u0432\u044b\u0435 \u0444\u0438\u0448\u043a\u0438 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0432 IDE<\/a>.<\/li>\n<li><a href=\"#http_client\">HTTP-\u043a\u043b\u0438\u0435\u043d\u0442<\/a> \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b Guzzle \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 cURL.<\/li>\n<li><a href=\"#code_with_me\">\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/li>\n<li><a href=\"#editor\">\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440<\/a> \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b Mermaid.js, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c, \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044f \u0438\u0445.<\/li>\n<li><a href=\"#git_stage\">Git stage<\/a> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0434\u043b\u044f changelists.<\/li>\n<li><a href=\"#db_tools\">\u0412 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u0411\u0414<\/a> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d SQL \u0434\u043b\u044f MongoDB.<\/li>\n<li><a href=\"#tailwind_css\">Tailwind CSS<\/a> \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<p>  <a name=\"php8\"><\/a>  <\/p>\n<h1>PHP 8<\/h1>\n<p>  <a href=\"https:\/\/www.php.net\/releases\/8.0\/\">PHP 8.0<\/a> \u0432\u044b\u043f\u0443\u0449\u0435\u043d. \u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u0430\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c \u0440\u0435\u043b\u0438\u0437\u0430!<\/p>\n<p>  PhpStorm 2020.3 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 IDE.<\/p>\n<h2>\u0412\u0435\u0440\u0441\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0431\u0430\u0440\u0435<\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f PHP \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0442\u0442\u0443\u0434\u0430 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c4b\/153\/51f\/c4b15351fc40e9d913f8207646ef5f47.gif\" width=\"600\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0435\u043d, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044e PHP \u0437\u0430\u0434\u0430\u043d\u043e \u0432 composer.json.<\/p>\n<h2>\u0418\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b<\/h2>\n<p>  \u0412 PHP 8 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. \u0412\u044b\u0437\u043e\u0432\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0441\u043b\u043e\u0432\u0430.<\/p>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0432\u0438\u043a-\u0444\u0438\u043a\u0441\u0430 <strong>Add name identifiers<\/strong> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/03e\/752\/c51\/03e752c518f5fabe1c1bacb30b3b39f4.gif\" width=\"600\"><\/p>\n<p>  \u041e\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/186\/36c\/671\/18636c6715491c96d9654255f9384431.png\" width=\"540\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/964\/94a\/53f\/96494a53f0b7f81f8a4ef5c3fc38a6cc.gif\" width=\"600\"><\/p>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 options \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b95\/48b\/c79\/b9548bc79d64e1877409961f58075d23.png\" width=\"624\"><\/p>\n<h2>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b<\/h2>\n<p>  \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u2014 \u044d\u0442\u043e \u043d\u043e\u0432\u044b\u0439, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PHP \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 PHPDoc.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u043d\u0430\u0434\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440 <code>#[Attribute]<\/code>. \u0417\u0434\u0435\u0441\u044c PhpStorm \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439, \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0439, \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/309\/012\/276\/30901227677622eae18911f635be65a9.gif\" width=\"624\"><\/p>\n<p>  \u0421\u0430\u043c PHP \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>ReflectionAttribute::newInstance()<\/code>. \u0410 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u0447\u0435\u0440\u0435\u0437 Reflection, \u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 PhpStorm \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435, \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f Reflection API. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430:<\/p>\n<ul>\n<li> \u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c.\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f2a\/5ca\/ae8\/f2a5caae88bcd2ad7d795b951b8cc005.gif\" width=\"600\">   <\/li>\n<li> \u0414\u0430\u043d\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445: \u043a\u043b\u0430\u0441\u0441, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u043c\u0435\u0442\u043e\u0434, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430.\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/656\/8ab\/55b\/6568ab55b17f5ae98f7e2bf676855ee6.png\" width=\"600\">   <\/li>\n<li> \u0410\u0442\u0440\u0438\u0431\u0443\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>Attribute::IS_REPEATABLE<\/code>.\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1f6\/b99\/2ff\/1f6b992ff87c844592dcbb49195d76fa.png\" width=\"600\">   <\/li>\n<\/ul>\n<p>  \u0412\u043e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 Symfony:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d73\/6ba\/ce8\/d736bace83cc443f781a2d958a5fba05.gif\" width=\"624\"><\/p>\n<hr>\n<p>  <a name=\"phpstorm_attributes\"><\/a><\/p>\n<h2>\u0428\u0442\u043e\u0440\u043c\u043e\u0432\u0441\u043a\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b PHP 8<\/h2>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 PhpStorm 2020.3 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0432 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0435 <code>\\JetBrains\\PhpStorm\\<\/code>.<\/p>\n<p>  \u0418\u0445 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0435\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044f.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u0442\u0438\u043f\u0430 <em>Class not found<\/em>, \u0442\u043e \u0442\u043e\u0433\u0434\u0430, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 <a href=\"https:\/\/github.com\/JetBrains\/phpstorm-attributes\"><strong>JetBrains\/phpstorm-attributes<\/strong><\/a> \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 <code>composer.json<\/code>.<\/p>\n<p>  <a name=\"deprecated\"><\/a>  <\/p>\n<h2>#[Deprecated]<\/h2>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043a\u0430\u043a PHPDoc-\u0442\u0435\u0433 @deprecated, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<p>  \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u0443\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0443 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440. \u0412 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c <a href=\"https:\/\/github.com\/symfony\/symfony\/releases\/tag\/v5.2.0\">Symfony 5.2<\/a> \u043c\u0435\u0442\u043e\u0434 <code>\\Symfony\\Component\\DependencyInjection\\Alias::setPrivate()<\/code> <a href=\"https:\/\/github.com\/symfony\/symfony\/blob\/6440b70b3124036b44f6b7af5e9d23e9226f2dc0\/src\/Symfony\/Component\/DependencyInjection\/Alias.php#L57\">\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c<\/a>. \u0415\u0441\u043b\u0438 \u0442\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>#[Deprecated]<\/code>, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e.<\/p>\n<pre><code class=\"php\">#[Deprecated(    reason: 'since Symfony 5.2, use setPublic() instead',    replacement: '%class%-&gt;setPublic(!%parameter0%)' )] <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/537\/b2b\/872\/537b2b87221513bc5994ee77312283ed.gif\" width=\"624\"><\/p>\n<p>  <a name=\"arrayshape\"><\/a>  <\/p>\n<h2>#[ArrayShape]<\/h2>\n<p>  \u042d\u0442\u043e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441.<\/p>\n<p>  \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439:  <\/p>\n<pre><code class=\"php\">#[ArrayShape([ \/\/ \u2018key\u2019 =&gt; \u2019type\u2019,    \u2018key1\u2019 =&gt; \u2018int\u2019,    \u2018key2\u2019 =&gt; \u2018string\u2019,    \u2018key3\u2019 =&gt; \u2018Foo\u2019,    \u2018key3\u2019 =&gt; App\\PHP 8\\Foo::class, ])] function functionName(...): array <\/code><\/pre>\n<p>  \u0422\u0438\u043f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043a\u0430\u043a \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441 \u0432 \u0432\u0438\u0434\u0435 FQN \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b <code>::class<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1f7\/90d\/bd7\/1f790dbd77616c7db9f0609a8585bf74.gif\" width=\"624\"><\/p>\n<p>  \u041c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u00ab\u0444\u043e\u0440\u043c\u0443\u00bb, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"php\">const  MY_ARRAY_SHAPE = []; #[ArrayShape(MY_ARRAY_SHAPE)] <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/aba\/0fe\/78c\/aba0fe78c740c1b4a669b04a7332723a.gif\" width=\"624\"><\/p>\n<p>  \u0412 PhpStorm \u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u043e\u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>#[ArrayShape]<\/code> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 PHP, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>parse_url()<\/code>.<\/p>\n<p>  \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c. \u0422\u043e \u0435\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>#[ArrayShape]<\/code> \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0430 PHP 7, \u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 PHP \u0432\u043e\u0441\u043f\u0440\u0438\u043c\u0435\u0442 \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u0430\u043a \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439.<\/p>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 PHP, PhpStorm \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b! \u0422\u0430\u043a \u0447\u0442\u043e, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 PHP 7.4 \u0438\u043b\u0438 \u043d\u0438\u0436\u0435, \u0432\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u0443 \u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>#[ArrayShape]<\/code>.<\/p>\n<p>  <a name=\"immutable\"><\/a>  <\/p>\n<h2>#[Immutable]<\/h2>\n<p>  \u041d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0418\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c \u0438 \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0443.<\/p>\n<p>  \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>#[Immutable]<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b.<\/p>\n<p>  PhpStorm \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3f8\/9d5\/e0c\/3f89d5e0c6d393c5189b96dbbf0fe9d2.png\" width=\"624\"><\/p>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 private\/protected. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 <code>CONSTRUCTOR_WRITE_SCOPE<\/code>, <code>PRIVATE_WRITE_SCOPE<\/code>, <code>PROTECTED_WRITE_SCOPE<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>#[Immutable]<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/370\/ab2\/17c\/370ab217c38d24459500d2fdfae95671.gif\" width=\"624\"><\/p>\n<p>  <a name=\"pure\"><\/a>  <\/p>\n<h2>#[Pure]<\/h2>\n<p>  \u042d\u0442\u0438\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0438\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432. \u0422\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/308\/1d2\/f50\/3081d2f5090a919c4ef05e954c9d6efc.png\" width=\"624\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a \u0447\u0438\u0441\u0442\u0430\u044f, \u043d\u043e \u0432 \u0435\u0435 \u0442\u0435\u043b\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0441\u043a\u043e\u0443\u043f\u0430, \u0442\u043e PhpStorm \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/046\/319\/e6c\/046319e6c8da8ac2e3101e9e1e18b360.gif\" width=\"624\"><\/p>\n<p>  \u0412\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 PHP \u0443\u0436\u0435 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u044d\u0442\u0438\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c \u0432 PhpStorm.<\/p>\n<p>  <a name=\"expectedvalues\"><\/a>  <\/p>\n<h2>#[ExpectedValues]<\/h2>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c.<\/p>\n<p>  \u042d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <a href=\"https:\/\/www.jetbrains.com\/help\/phpstorm\/ide-advanced-metadata.html#expected-arguments\"><code>expectedArguments()<\/code><\/a> \u0432 <code>.phpstorm.meta.php<\/code>. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043b\u0438\u0448\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0442\u0430-\u0432\u0435\u0440\u0441\u0438\u044f, \u0441\u043a\u043e\u0440\u0435\u0435, \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f, \u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0436\u0435\u0441\u0442\u043a\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435\u0442.<\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e count:  <\/p>\n<pre><code class=\"php\">count ( array|Countable $array_or_countable [, int $mode = COUNT_NORMAL ] ) : int<\/code><\/pre>\n<p>  \u0415e \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0430 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 <code>COUNT_NORMAL<\/code> \u0438\u043b\u0438 <code>COUNT_RECURSIVE<\/code>.<\/p>\n<p>  \u0412\u043e\u0442 \u043a\u0430\u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>#[ExpectedValues]<\/code> \u0443\u043b\u0443\u0447\u0448\u0438\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/453\/cc7\/6d8\/453cc76d8e4a486a7559b8439b3520dd.png\" width=\"624\"><\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435, \u0442\u043e \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u043a\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\"> \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445:   <\/p>\n<ul>\n<li> \u0427\u0438\u0441\u043b\u0430: <code>#[ExpectedValues(values: [1,2,3])]<\/code>   <\/li>\n<li> \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b: <code>#[ExpectedValues(values: [\u2018red\u2019, \u2018black\u2019, \u2018green\u2019])]<\/code>   <\/li>\n<li> \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b: <code>#[ExpectedValues(values: [COUNT_NORMAL, COUNT_RECURSIVE])]<\/code>   <\/li>\n<li> \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430: <code>#[ExpectedValues(values: [Code::OK, Code::ERROR])]<\/code>   <\/li>\n<\/ul>\n<p>  \u0418 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:   <\/p>\n<ul>\n<li> <code>#[ExpectedValues(values: [1,2,3])]<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.   <\/li>\n<li> <code>#[ExpectedValues(flags: [1, 2, 3])]<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>1 | 3<\/code>.   <\/li>\n<li> <code>#[ExpectedValues(valuesFromClass: MyClass::class)]<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u0430\u044f \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 `<code>MyClass<\/code>`.   <\/li>\n<li> <code>#[ExpectedValues(flagsFromClass: ExpectedValues::class)]<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 `MyClass`.   <\/li>\n<\/ul>\n<p>  <\/div>\n<\/p><\/div>\n<h3>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440 #[ExpectedValues]<\/h3>\n<p>  \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0445\u0435\u043b\u043f\u0435\u0440 <code>response()<\/code> \u0438\u0437 Laravel. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u0434 HTTP.<\/p>\n<p>  \u0415\u0441\u0442\u044c \u0434\u0432\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b  <\/p>\n<ul>\n<li>\u041d\u0435\u0442 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u043a\u043e\u0434\u0430\u043c\u0438  <\/li>\n<li>\u041d\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435  <\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/216\/05b\/f4f\/21605bf4fbd2e492fd22cbd86d530461.gif\" width=\"624\"><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>#[ExpectedValues(valuesFromClass: Response::class)]<\/code><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a94\/44f\/851\/a9444f851a022e64bac9bc6baa87d25b.gif\" width=\"624\"><\/p>\n<p>  <a name=\"noreturn\"><\/a>  <\/p>\n<h2>#[NoReturn]<\/h2>\n<p>  \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430. \u0415\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>#[NoReturn]<\/code>, \u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/579\/229\/195\/57922919524fab885866d3653ad6fef9.gif\" width=\"624\"><\/p>\n<p>  <a name=\"language\"><\/a>  <\/p>\n<h2>#[Language]<\/h2>\n<p>  \u042d\u0442\u043e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043b\u0438\u0431\u043e \u044f\u0437\u044b\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 RegExp, SQL, DQL \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ac5\/330\/a76\/ac5330a76a9d326858d1a34b342b24de.gif\" width=\"600\"><\/p>\n<hr>\n<p>  \u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c PHP 8.<\/p>\n<h2>\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435<\/h2>\n<p>  \u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 promoted \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0432\u0438\u043a-\u0444\u0438\u043a\u0441\u0430 <em>Convert to promoted property<\/em>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/043\/01e\/d3a\/04301ed3a99023b6728ee475eb668c95.gif\" width=\"624\"><\/p>\n<p>  PhpStorm \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u043c \u0432 PHP 8:  <\/p>\n<ul>\n<li>\u041c\u043e\u0436\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435.  <\/li>\n<li>\u041d\u0435\u043b\u044c\u0437\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0432 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435.  <\/li>\n<li>\u041d\u0435\u043b\u044c\u0437\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e variadic \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.  <\/li>\n<li>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u0438\u043f &#8216;Callable&#8217;.  <\/li>\n<li>\u041d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.  <\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9b6\/76b\/a8a\/9b676ba8adfcdd6e81a49ebaac168f70.png\" width=\"624\"><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/943\/7fd\/9c3\/9437fd9c34ae6c64b6c198f10a5aa9ee.png\" width=\"624\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043d\u043e \u0432 \u0442\u0435\u043b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0442\u043e PhpStorm \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442 \u0435\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/04a\/ac5\/20e\/04aac520e0574a3aa1af9eb15c84d4d0.gif\" width=\"600\"><\/p>\n<h2>\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 match<\/h2>\n<p>  \u041d\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 <code>switch<\/code>, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043e.<\/p>\n<p>  PhpStorm \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u0431\u043b\u043e\u043a <code>switch<\/code> \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043d \u0432 <code>match<\/code>, \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0432\u0438\u043a-\u0444\u0438\u043a\u0441\u0430 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e Alt+Enter:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/72d\/b93\/d6a\/72db93d6a14d7040201a07de8ffce6b9.gif\" width=\"600\"><\/p>\n<p>  \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 PhpStorm \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6ae\/575\/b9c\/6ae575b9c9542f15f6a5ff4aeb2d2070.gif\" width=\"600\"><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3c4\/956\/9e3\/3c49569e3d1b55999540c6ca58d30db5.png\" width=\"600\"><\/p>\n<p>  \u0411\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f4d\/b6b\/b75\/f4db6bb759a32f73fe46aaaac6295d3e.gif\" width=\"600\"><\/p>\n<p>  \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 match \u0441 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u043e\u0439 \u0438 \u0432\u0435\u0442\u043a\u043e\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u043e \u043d\u0430 \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/17e\/248\/e87\/17e248e8703b85fd6e3b1e9a2f956486.gif\" width=\"600\"><\/p>\n<p>  \u0410 \u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0442\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 match \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4e3\/237\/153\/4e32371531691225c7ee84a15820d0a7.gif\" width=\"600\"><\/p>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u043b\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0442\u0432\u044f\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0442\u0435\u043b\u0430, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/585\/3cf\/401\/5853cf401dc5ecbca8ba1c569945dd69.gif\" width=\"600\"><\/p>\n<h2>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 nullsafe<\/h2>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u043a\u0443\u0447\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043d\u0430 null \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c <code>?-&gt;<\/code>.<\/p>\n<p>  PhpStorm \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5cc\/904\/a65\/5cc904a65e494c10feb531e3fb9d24f4.png\" width=\"600\"><\/p>\n<h2>\u0412\u0438\u0441\u044f\u0447\u0430\u044f \u0437\u0430\u043f\u044f\u0442\u0430\u044f<\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 <code>use<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/484\/68c\/db1\/48468cdb1ee36ba5ff17433d11442192.gif\" width=\"600\"><\/p>\n<h2>Non-capturing catches<\/h2>\n<p>  \u0412 PHP 8 \u043c\u043e\u0436\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 catch-\u0431\u043b\u043e\u043a\u0435 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e94\/ebb\/368\/e94ebb368a00d8dfa44d439cd2d6eb24.gif\" width=\"600\"><\/p>\n<h2>\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 throw<\/h2>\n<p>  \u0411\u0440\u043e\u0441\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0432 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0438 \u0432 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u0445 <code>??<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u043e\u043c <code>? :<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8ad\/cd1\/a7c\/8adcd1a7cc42b2cc5987621e75249fc8.png\" width=\"624\"><\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 <code>thr<\/code> \u0438 \u043d\u0430\u0436\u0430\u0442\u044c tab \u2014 \u044d\u0442\u043e <a href=\"https:\/\/www.youtube.com\/watch?v=ec3aOtWxOog\">live template<\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5e0\/46b\/82e\/5e046b82ec4ea10399d1d7212af64a09.gif\" width=\"600\"><\/p>\n<h2>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 ::class \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445<\/h2>\n<p>  \u0420\u0430\u043d\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c FQN \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>get_class()<\/code>. \u0412 PHP 8 \u0432\u044b\u0437\u043e\u0432 <code>get_class($object)<\/code> \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 <code>$object::class<\/code>.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e Alt+Enter \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 \u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b <code>::class<\/code> PhpStorm \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b41\/b41\/ba8\/b41b41ba8b848d1a565120a1c27e3d8c.gif\" width=\"600\"><\/p>\n<h2>\u041d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a: str_contains(), str_starts_with(), str_ends_with()<\/h2>\n<p>  <a href=\"https:\/\/stackoverflow.com\/questions\/4366730\/how-do-i-check-if-a-string-contains-a-specific-word\">How do I check if a string contains a specific word?<\/a> \u2014 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e PHP \u043d\u0430 Stack Overflow. \u0412 PHP 8 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u043a\u0438\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>str_contains()<\/code>.<\/p>\n<p>  PhpStorm 2020.3 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432\u044b <code>strpos()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 <code>str_contains()<\/code>:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/51a\/a20\/9eb\/51aa209ebeaae949bfe794ed39a248a2.gif\" width=\"600\"><\/p>\n<p>  \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u043d\u043e\u0432\u044b\u0435 <code>str_starts_with()<\/code> \u0438 <code>str_ends_with()<\/code> \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u043e\u0439. PhpStorm \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u0442, \u0433\u0434\u0435 \u0432\u044b\u0437\u043e\u0432\u044b <code>substr()<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u043c\u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u043c\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/707\/5f1\/42c\/7075f142c0db750c9d51e042ad847031.gif\" width=\"600\"><\/p>\n<h2>Reclassified engine warnings<\/h2>\n<p>  \u0412 PHP 8 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0442\u0438\u043f \u0431\u0440\u043e\u0441\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e, \u0432\u043c\u0435\u0441\u0442\u043e Notice \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0431\u0443\u0434\u0435\u0442 Exception \u0438\u043b\u0438 Type Error.<\/p>\n<p>  \u0412 PhpStorm \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u044f severity: \u0434\u043b\u044f PHP 8 \u0438 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cb6\/e45\/c68\/cb6e45c688aa1daff490616e33bd5944.gif\" width=\"600\"><\/p>\n<p>  \u042d\u0442\u043e \u0432\u0441\u0435 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u043e PHP 8. \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u0446\u0435\u043b\u0430\u044f \u043a\u0443\u0447\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e\u043c\u0435\u043b\u044c\u0447\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u043d\u044b \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u0430 PHP 8.<\/p>\n<p>  <a name=\"psalm_and_phpstan\"><\/a>  <\/p>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Psalm \u0438 PHPStan<\/h2>\n<p>  \u041e\u0431\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 PhpStorm 2020.3 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c0f\/d66\/ae8\/c0fd66ae87ce2f0b2b5460b0a88a60b5.gif\" width=\"624\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 PHPStan \u0438\u043b\u0438 Psalm \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 <code>composer.json<\/code>, \u0442\u043e \u0440\u044f\u0434\u043e\u043c \u0441 \u043d\u0438\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0447\u043e\u043a \u0433\u0430\u0435\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cc9\/0ef\/c32\/cc90efc32cb66dd82ee72597b830a5d0.gif\" width=\"624\"><\/p>\n<p>  \u041e\u0442\u0442\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <em>PHP | Quality tools <\/em>\u0432 <em>Settings\/Preferences | Editor | Inspections<\/em>.<\/p>\n<p>  \ufe0f \u041b\u0443\u0447\u0448\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u043d\u0435 \u043e\u0431\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/83c\/5db\/bf7\/83c5dbbf7faa6e9cd72889e5d8cbd244.gif\" width=\"624\"><\/p>\n<p>  \u0422\u0443\u0442 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>  \ufe0f PHPStan \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0430 \u0434\u043b\u044f Psalm \u043e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0435\u0441\u0442\u044c <code>psalm.xml<\/code> \u0438\u043b\u0438 <code>phpstan.neon<\/code>, PhpStorm \u043f\u043e\u0434\u0442\u044f\u043d\u0435\u0442 \u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043b\u044e\u0431\u043e\u0439 \u0444\u0430\u0439\u043b, \u0438 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u043e\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/37b\/7d4\/67b\/37b7d467bc226ad27f8d887596bfa7ec.gif\" width=\"624\"><\/p>\n<h3>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/h3>\n<p>  \u0412\u0441\u0435 \u043f\u0441\u0430\u043b\u043c\u043e\u0432\u0441\u043a\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <code>@psalm-*<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u041d\u043e \u0432\u043e\u043e\u0431\u0449\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>@psalm-<\/code> \u0438\u0437 \u0442\u0435\u0433\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c <code>@psalm-return<\/code> -&gt; <code>@return<\/code> \u0438 <code>@psalm-param<\/code> -&gt; <code>@param<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e44\/306\/c84\/e44306c84f93bdba3dbebf6c911d9029.png\" width=\"624\"><\/p>\n<h3>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432<\/h3>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 Psalm \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u0442\u0435\u0433\u043e\u0432 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438 \u043d\u0430\u0448 \u0432\u044b\u0432\u043e\u0434 \u0442\u0438\u043f\u043e\u0432. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u0438 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  <strong>\u041f\u0441\u0435\u0432\u0434\u043e\u0442\u0438\u043f\u044b <\/strong><br \/>  \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0441\u0430\u043b\u043c\u043e\u0432\u0441\u043a\u0438\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0438\u043f\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a scalar, numeric \u0438 \u0442. \u043f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ccd\/42d\/ba3\/ccd42dba3957a7452b7da3d9ae4198db.png\" width=\"624\"><\/p>\n<p>  <strong>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0432 \u0442\u0438\u043f\u0430\u0445<\/strong><br \/>  \u041f\u043e\u0436\u0436\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <code>*<\/code> \u0432 \u0442\u0435\u0433\u0430\u0445 <a href=\"https:\/\/habr.com\/ru\/users\/param\/\" class=\"user_link\">param<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/users\/var\/\" class=\"user_link\">var<\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/109\/caa\/f61\/109caaf61d3f2f9c100a4ae8fcb92a35.png\" width=\"624\"><\/p>\n<p>  <strong>\u0422\u0430\u0439\u043f\u0445\u0438\u043d\u0442\u044b \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432<\/strong><br \/>  \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 <code>array&lt;array-key, Type&gt;<\/code> \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7a0\/063\/e1e\/7a0063e1e5b7b64e5b9d701d44cfb1d0.gif\" width=\"624\"><\/p>\n<p>  <strong>\u0414\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438 \u0438 @tempate<\/strong><br \/>  \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432 \u2014 \u0444\u0438\u0447\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043c\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f <code>@template<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u041f\u0441\u0430\u043b\u043c\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u041f\u043e\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/329\/a46\/eed\/329a46eed9454789111fc3a9d1d3a7c4.gif\" width=\"624\"><\/p>\n<blockquote><p>\u042d\u0442\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0439, \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439. \u0425\u043e\u0442\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0411\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/WI\">\u043d\u0430\u0448 \u0442\u0440\u0435\u043a\u0435\u0440<\/a>.<\/p><\/blockquote>\n<p>  <a name=\"xdebug\"><\/a><\/p>\n<h2>Xdebug 3<\/h2>\n<p>  \u041e\u0431\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a \u0434\u043b\u044f PHP, \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438 \u043f\u0440\u043e\u0449\u0435 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0431 Xdebug 3 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 <a href=\"https:\/\/3.xdebug.org\/docs\/upgrade_guide\">Upgrade guide<\/a>.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Xdebug 3, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 <a href=\"https:\/\/xdebug.org\/docs\/all_settings#mode\">xdebug.mode<\/a> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a <code>XDEBUG_MODE=debug<\/code>).<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 Xdebug: \u0432\u043c\u0435\u0441\u0442\u043e <code>9000<\/code> \u0442\u0435\u043f\u0435\u0440\u044c <code>9003<\/code>. \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e, PhpStorm \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u043e\u0431\u0430 \u043f\u043e\u0440\u0442\u0430. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0440\u0442\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f Xdebug \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 <em>Preferences\/Settings | Languages &amp; Frameworks | PHP | Debug<\/em>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2a4\/815\/7bd\/2a48157bddfecdca8c44663c7961061b.gif\" width=\"810\"><\/p>\n<p>  <a name=\"debugger_improvements\"><\/a>  <\/p>\n<h2>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430<\/h2>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0432 PhpStorm \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0438\u0441\u044c \u0434\u0432\u0443\u043c\u044f \u043d\u043e\u0432\u044b\u043c\u0438 \u0444\u0438\u0448\u043a\u0430\u043c\u0438.<\/p>\n<p>  <strong>\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0445\u0438\u043d\u0442\u044b<\/strong><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u044b\u0432\u043e\u0434 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f. \u0422\u0443\u0442 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/53f\/ff6\/749\/53fff67495f5fe78c4c79e4681827a66.gif\" width=\"810\"><\/p>\n<p>  <strong>Inline Watches<\/strong><br \/>  \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a watch \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0448\u0430\u0433\u0430\u043c.<\/p>\n<p>  \u0412 PhpStorm 2020.3 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u043e\u0442\u0447\u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0438 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>  \u041d\u0430\u0436\u043c\u0438\u0442\u0435 <em>Add as Inline Watch<\/em> \u0432 \u043f\u043e\u043f\u0430\u043f\u0435 \u043d\u0430 \u0445\u0438\u043d\u0442\u0435.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e76\/8af\/c90\/e768afc90f5b69b616545bd526777b3e.gif\" width=\"600\"><\/p>\n<p>  \u0418\u043b\u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 <em>Add Inline Watch<\/em> \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/65e\/d4d\/200\/65ed4d2004a9e045bb1a3bef9bd00267.gif\" width=\"600\"><\/p>\n<p>  \u0418\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 <em>Add Inline Watch<\/em>.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/118\/027\/a2e\/118027a2e0e019375c1e663ffb3e1030.gif\" width=\"600\"><\/p>\n<h2>\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 Twig<\/h2>\n<p>  \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u043b\u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u043d\u0430 \u043d\u0435\u0435 \u043a\u0443\u0440\u0441\u043e\u0440, \u0438 \u0432\u0441\u0435 \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0435\u043d\u044b. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Shift + F6.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/16e\/2d2\/f3d\/16e2d2f3d291fa331fcd14a23a4e0c13.gif\" width=\"624\"><\/p>\n<p>  <a name=\"code_with_me\"><\/a>  <\/p>\n<h2>\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u2013 Code With Me<\/h2>\n<p>  \u0412 PhpStorm 2020.3 \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/14896-code-with-me\">Code With Me<\/a> \u2014 \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 JetBrains \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0430\u0440\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043d\u0438\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e Code With Me <a href=\"https:\/\/blog.jetbrains.com\/tag\/codewithme\">\u0432 \u044d\u0442\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445<\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4da\/479\/4d0\/4da4794d02461069abddbe25f75425b0.gif\" width=\"810\"><\/p>\n<p>  <a name=\"http_client\"><\/a>  <\/p>\n<h2>HTTP-\u043a\u043b\u0438\u0435\u043d\u0442<\/h2>\n<p>  <\/p>\n<h3>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Guzzle \u0441 HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0432 PhpStorm<\/h3>\n<p>  <a href=\"https:\/\/github.com\/guzzle\/guzzle\">Guzzle<\/a> \u2014 \u043e\u0434\u0438\u043d \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 HTTP \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f PHP. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u0435\u0441\u0442\u044c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u0441\u0430\u043c \u043a\u043e\u0434. \u0420\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>  PhpStorm 2020.3 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b Guzzle \u0432 \u0444\u0430\u0439\u043b\u044b .http. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0440\u044f\u0434\u043e\u043c \u0441 \u043d\u0438\u043c \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438\u043a\u043e\u043d\u043a\u0430. \u041d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043d\u0435\u0435, \u0432\u044b \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 scratch-\u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c URL, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438, \u0442\u0435\u043b\u043e\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0af\/c73\/87a\/0afc7387abe6edb787424dd5548aa9e4.gif\" width=\"624\"><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a http-\u0444\u0430\u0439\u043b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<blockquote><p>\u0411\u043e\u043b\u044c\u0448\u0435 \u043e\u0431 HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0432 <a href=\"https:\/\/www.youtube.com\/watch?v=n8KCuKhDSZY\">\u0432\u0438\u0434\u0435\u043e\u043e\u0431\u0437\u043e\u0440\u0435<\/a>.<\/p><\/blockquote>\n<p>  <\/p>\n<h3>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0432 cURL<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0432 cURL-\u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Alt+Enter \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 <em>Convert to cURL and copy to clipboard<\/em>. \u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f API.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/514\/3fd\/72f\/5143fd72f474ef6508951d8728fff201.gif\" width=\"624\"><\/p>\n<p>  <a name=\"editor\"><\/a>  <\/p>\n<h2>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440<\/h2>\n<p>  <\/p>\n<h3>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f Markdown<\/h3>\n<p>  \u0414\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <a href=\"https:\/\/mermaid-js.github.io\/mermaid\/#\/\"><strong>Mermaid.js<\/strong><\/a> \u0432 markdown-\u0444\u0430\u0439\u043b\u0430\u0445. PhpStorm \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u043c\u0435\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u043d\u0438\u0445 \u043f\u0440\u044f\u043c\u043e \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 <em>Preferences\/Settings | Languages &amp; Frameworks | Markdown<\/em>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ef6\/7dc\/f96\/ef67dcf963dc0c004c4c878f36e4776d.png\" width=\"810\"><\/p>\n<p>  \u0415\u0449\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 .md \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0441\u0442\u0438\u043b\u044f\u043c\u0438. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u2318\u2325L \/ Ctrl+Alt+L.<\/p>\n<p>  \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <em>Preferences\/Settings | Editor | Code Style | Markdown<\/em>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/01b\/96d\/9c3\/01b96d9c3ec687da1d0db78583970f86.gif\" width=\"624\"><\/p>\n<p>  \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 <strong>Auto-Scroll Preview<\/strong> \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u0442\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043f\u0440\u0435\u0432\u044c\u044e \u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/p>\n<h3>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438<\/h3>\n<p>  \u041e\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435:  <\/p>\n<ul>\n<li>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u043e\u043a\u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.  <\/li>\n<li>\u0410 \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c Alt+Enter \u043d\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0435\u043d\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435, \u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0437\u0430\u043c\u0435\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u044b \u043d\u0430\u0432\u0435\u0440\u0445\u0443, \u0430 \u043d\u0435 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u044b \u0432 \u043f\u043e\u0434\u043f\u0443\u043d\u043a\u0442, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435.  <\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f58\/a17\/8c4\/f58a178c4851da3e3b2b5527a274da25.gif\" width=\"600\"><\/p>\n<h3>\u0421\u043f\u043b\u0438\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u043e\u043a \u043e \u0431\u043e\u043a, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6b9\/7ae\/25e\/6b97ae25e8251a20c7e79c197516ec03.gif\" width=\"624\"><\/p>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u0432 \u0441\u043f\u043b\u0438\u0442-\u0440\u0435\u0436\u0438\u043c\u0435 \u2014 Shift+Enter.<br \/>  \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0432 <em>Project view<\/em> \u0438\u043b\u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0444\u0430\u0439\u043b\u0430\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/490\/a15\/38a\/490a1538ac58fb943c2ad21993191405.gif\" width=\"800\"><\/p>\n<h3>\u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430<\/h3>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0444\u0430\u0439\u043b\u044b, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u043a\u043b\u0430\u0434\u043a\u0443 <strong>Preview tab<\/strong>.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0435, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u0448\u0435\u0441\u0442\u0435\u0440\u0435\u043d\u043a\u0443 \u0432 <em>Project view<\/em> \u0438 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 <em>Enable Preview Tab<\/em> \u0438 <em>Open Files with Single Click<\/em>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4c0\/a2e\/767\/4c0a2e7675a84bbdcd6e244890dc53fc.gif\" width=\"624\"><\/p>\n<p>  \u0415\u0449\u0435 \u043c\u043e\u0436\u043d\u043e <strong>\u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b <\/strong><strong>\u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u0430<\/strong> \u0432 Project view<strong>, \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044f \u0438\u0445.<\/strong><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/314\/322\/5aa\/3143225aa9ef154c6a3f18c6838df6e0.png\" width=\"624\"><\/p>\n<p>  <a name=\"ide\"><\/a>  <\/p>\n<h2>IDE<\/h2>\n<p>  <\/p>\n<h3>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f Search Everywhere<\/h3>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2df\/ee6\/54a\/2dfee654aff047f1621c096d5a5ba57f.png\" width=\"800\"><\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c <strike>\u0433\u0443\u0433\u043b<\/strike> \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4a2\/2ec\/5c5\/4a22ec5c59c7243d72490e79e72558b5.png\" width=\"800\"><\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 Git:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d2e\/213\/f7b\/d2e213f7bb81eb738b1c302507e372db.png\" width=\"800\"><\/p>\n<h3>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0432\u0435\u0442\u043b\u0443\u044e \u0438\u043b\u0438 \u0442\u0435\u043c\u043d\u0443\u044e \u0442\u0435\u043c\u0443<\/h3>\n<p>  \u0412 <em>Preferences\/Settings | Appearance &amp; Behavior | Appearance | Theme<\/em> \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 <strong>Sync with OS<\/strong>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/300\/308\/4e1\/3003084e18ac0cbc802eef762016d8de.png\" width=\"800\"><\/p>\n<h3>\u041d\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448 \u0434\u043b\u044f macOS<\/h3>\n<p>  \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0430 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448 \u0434\u043b\u044f macOS \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0432\u0438\u0448, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0440\u0443\u043a\u0443 \u043d\u0430 \u0432\u0441\u044e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u043f\u0440\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u043e Fn+Shift+F6 \u0434\u043b\u044f Rename \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u2325+\u2318+R.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e0a\/965\/3bb\/e0a9653bbcf0e18de7157b2bc492ea5d.png\" width=\"624\"><\/p>\n<h3>\u0421\u043b\u043e\u0432\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u043a\u043e\u043d\u043e\u043a \u0434\u043b\u044f \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448 macOS<\/h3>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u043a\u043e\u043d\u043e\u043a \u0442\u0438\u043f\u0430 \u2325 \u2318 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0438\u0441\u044c \u0441\u043b\u043e\u0432\u0430 Alt, Cmd \u0438 \u0442. \u043f.<\/p>\n<p>  \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 Registry \u043e\u043f\u0446\u0438\u0435\u0439 <em>ide.macos.disable.native.shortcut.symbols<\/em>. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0435\u0441\u0442\u0440\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <em>Find Action<\/em> Cmd+Shift+A \u0438 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0442\u0430\u043c <em>Registry<\/em>.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c PhpStorm \u043a\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432<\/h3>\n<p>  \u0412 <em>Preferences | Settings \/ Editor \/ File Types<\/em> \u043d\u0430\u0436\u0430\u0442\u044c <em>Associate file types with PhpStorm\u2026<\/em>. \u0412 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432, \u0438 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 PhpStorm.<\/p>\n<p>  \u041d\u0430 macOS \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/944\/ef6\/d98\/944ef6d9850f37f5e69fd960f8555909.gif\" width=\"624\"><\/p>\n<h2>\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432<\/h2>\n<p>  \u041c\u043e\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0435\u043b\u0435\u0442 \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f \u0438\u043b\u0438 \u043a\u043e\u043c\u0431\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440-\u0432\u044c\u044e.<\/p>\n<p>  \u0412 <em>Preferences \/ Settings | Editor | File and Code Templates<\/em> \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fe0\/8f6\/c55\/fe08f6c553331464055fdbc2db0119d7.png\" width=\"24\">, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 <em>Create Child Template File<\/em> <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c1f\/aac\/8a2\/c1faac8a26739bad75977ab194c65652.png\" width=\"24\">.<\/p>\n<p>  \u0412 \u043f\u043e\u043b\u0435 File name \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/www.jetbrains.com\/help\/phpstorm\/file-template-variables.html\">\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u0430 <\/a><a href=\"https:\/\/www.jetbrains.com\/help\/phpstorm\/file-template-variables.html\"><code>${NAME}<\/code><\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cc6\/ed4\/c11\/cc6ed4c11489037b51b0a8887549ae5a.gif\" width=\"624\"><\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u0432 Symfony:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/dcc\/f21\/b09\/dccf21b09048505fe73b54e969126462.gif\" width=\"624\"><\/p>\n<p>  <a name=\"git_stage\"><\/a>  <\/p>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Git stage<\/h2>\n<p>  \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u043c <em>Enable staging area<\/em> \u0432 <em>Preferences\/Settings | Version Control | Git<\/em>.<\/p>\n<p>  \u0412 \u043e\u043a\u043d\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 <em>Commit <\/em>(Cmd+0 \/ Alt+0) \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0444\u0430\u0439\u043b\u043e\u0432: staged \u0438 unstaged.<\/p>\n<p>  <strong>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0432 staged<\/strong>, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 + \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0435\u0433\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/454\/8d6\/4ca\/4548d64ca4b31b2e4e4ae3b90dc164d9.gif\" width=\"624\"><\/p>\n<p>  \u0418\u043b\u0438 \u043c\u043e\u0436\u043d\u043e <strong>\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438<\/strong> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0438\u043a\u043e\u043d\u043a\u043e\u0439 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u0430 \u043d\u0430\u0434 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cf1\/2fb\/b08\/cf12fbb08e32ab518c84c29aa630bf5e.png\" width=\"624\"><\/p>\n<p>  <a name=\"db_tools\"><\/a>  <\/p>\n<h2>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0411\u0414<\/h2>\n<p>  PhpStorm \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/www.jetbrains.com\/datagrip\/\">DataGrip<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0445\u0432\u0430\u0447\u0435\u043d\u044b \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/JetBrains\/blog\/529634\/\">\u043e\u0431\u0437\u043e\u0440\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 DataGrip 2020.3<\/a> \u043e\u0442 \u043d\u0430\u0448\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433.<\/p>\n<h3>SQL \u0434\u043b\u044f MongoDB<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a MongoDB. PhpStorm 2020.3 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <code>SELECT-<\/code>\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 <code>JOIN<\/code><em>, <\/em><code>WHERE<\/code><em>, <\/em><code>GROUP BY<\/code><em>, <\/em><code>HAVING<\/code><em>, <\/em><code>ORDER BY<\/code><em>, <\/em><code>LIMIT<\/code><em>, <\/em><code>OFFSET<\/code>\u0438 \u0432\u0441\u0435\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 <a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/aggregation\/\">MongoDB<\/a><a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/aggregation\/\"> \u043a\u0440\u043e\u043c\u0435 <\/a>map, reduce, filter \u0438 let. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 <a href=\"https:\/\/blog.jetbrains.com\/datagrip\/2020\/10\/22\/datagrip-2020-3-eap-3-sql-for-mongodb\/\">\u0431\u043b\u043e\u0433-\u043f\u043e\u0441\u0442\u0435<\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/be2\/b1d\/330\/be2b1d33092d5691f7f85e9ab445e243.png\" width=\"600\"><\/p>\n<h2>\u0412\u0435\u0431<\/h2>\n<p>  \u041a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430, \u0432 PhpStorm \u0432\u0445\u043e\u0434\u044f\u0442 <a href=\"https:\/\/habr.com\/ru\/company\/JetBrains\/blog\/529708\/\">\u0432\u0441\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437 WebStorm 2020.3<\/a>. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Tailwind CSS.<br \/>  <a name=\"tailwind_css\"><\/a>  <\/p>\n<h2>Tailwind CSS<\/h2>\n<p>  PhpStorm \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u044b Tailwind \u0432 HTML-\u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b @apply. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0441\u0435\u0432\u0434\u043e-\u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<p>  <img decoding=\"async\" alt=\"tailwind-completion-after-apply\" width=\"600\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/097\/95d\/2f5\/09795d2f5279d38d86227c59068b0075.png\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043b\u0430\u0441\u0441 \u0432 HTML \u0438 CSS \u0444\u0430\u0439\u043b\u0430\u0445, \u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e CSS. \u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u0432\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u043e\u043a\u043d\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 F1 \/ Ctrl+Q.<\/p>\n<p>  <img decoding=\"async\" alt=\"tailwind-completion-for-pseudo-class-variants\" width=\"600\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d6c\/aee\/3a4\/d6caee3a4b4ba693a17578a1f7979763.png\"><\/p>\n<p>  PhpStorm \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437 tailwind.config.js. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u043c\u0443 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0446\u0432\u0435\u0442\u0430\u043c\u0438, \u0442\u043e \u0432\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u043e\u043a\u043d\u0435 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430.<\/p>\n<p>  <img decoding=\"async\" alt=\"tailwind-customization-support\" width=\"600\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/638\/4d7\/b7d\/6384d7b7d4973872860a5cad3d603ae3.png\"><\/p>\n<hr>\n<p>  <a href=\"https:\/\/www.jetbrains.com\/phpstorm\/download\/\"><strong>\u0421\u043a\u0430\u0447\u0430\u0442\u044c PhpStorm 2020.3<\/strong><\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u201c<a href=\"https:\/\/www.jetbrains.com\/ru-ru\/phpstorm\/whatsnew\/\">What\u2019s new<\/a>\u201d.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u0432\u0438\u0434\u0435\u043e\u0440\u043e\u043b\u0438\u043a (\u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c) \u0441 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0444\u0438\u0447 \u0440\u0435\u043b\u0438\u0437\u0430:<\/p>\n<div class=\"oembed\"><iframe id=\"5fcea8f5cb79a1e12d666470\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fcea8f5cb79a1e12d666470\"><\/iframe><\/div>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437. \u0411\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c, \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f\u043c, \u0431\u0430\u0433-\u0440\u0435\u043f\u043e\u0440\u0442\u0430\u043c \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u044b\u0441\u043b\u044f\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/div>\n<p> \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\/company\/JetBrains\/blog\/531828\/\"> https:\/\/habr.com\/ru\/company\/JetBrains\/blog\/531828\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><a href=\"https:\/\/habr.com\/ru\/company\/JetBrains\/blog\/531828\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fu\/jm\/bn\/fujmbnjgazmhfzpbxmbzrusuefa.jpeg\"><\/a><\/p>\n<p>  \u0420\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0436\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 PhpStorm \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443! \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u043d\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439.  <\/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-314510","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/314510","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=314510"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/314510\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=314510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=314510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=314510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}