{"id":353279,"date":"2024-05-20T22:24:50","date_gmt":"2024-05-20T22:24:50","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=353279"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=353279","title":{"rendered":"<span>\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 \u043a\u043e\u0434\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e PHP \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 Psalm<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0430\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e. \u041e\u0431 \u0438\u0445 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044f\u0445 \u0434\u043b\u044f PHP \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/habr.com\/ru\/companies\/badoo\/articles\/426605\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0410 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434 \u0432\u0430\u0448\u0438 \u043d\u0443\u0436\u0434\u044b, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Psalm.<\/p>\n<p>\u0412 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u043e \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0438 \u043e\u0434\u0438\u043d \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043c\u043e\u0447\u044c. \u0418 \u0437\u0434\u0435\u0441\u044c \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431 \u043e\u043f\u044b\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0442\u044c\u044f.<\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c <a href=\"https:\/\/www.jmsyst.com\/libs\/serializer\" rel=\"noopener noreferrer nofollow\">JMS Serializer<\/a> \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435 \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 JSON\/XML \u0434\u0430\u043d\u043d\u044b\u0445, \u0433\u0434\u0435 \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043c\u0430\u043f\u043b\u0435\u043d\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON\/XML.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0434\u0435\u0441\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"php\">&lt;?php  class ExampleDTO {       \/**        * @JMS\\Type(\"int\")        *\/          public $id;          \/**        *  @JMS\\Type(\"\\ExampleTypeDTO\")        *\/          public $type; }<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0434\u0435\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f $type \u043e\u043f\u0438\u0441\u0430\u043d \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0430, \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u043b\u0438\u043d\u0442\u0435\u0440 \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0435\u0433\u043e, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043b\u0430\u0441\u0441.<\/p>\n<p>\u0418 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433, \u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e. \u0418 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0435\u0441\u0442\u044b, \u0438 \u0432\u044b \u043f\u043b\u043e\u0445\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0432 \u0442\u0435\u0441\u0442\u0438\u043d\u0433\u0435 \u0438\u043b\u0438 \u0445\u0443\u0436\u0435, \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435.<\/p>\n<h2>\u041a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c?<\/h2>\n<p>\u041d\u0430\u0447\u0430\u043b \u044f \u0441<a href=\"https:\/\/psalm.dev\/docs\/running_psalm\/plugins\/authoring_plugins\/\" rel=\"noopener noreferrer nofollow\"> \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0437\u043d\u0430\u043b \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/psalm\/psalm-plugin-skeleton\" rel=\"noopener noreferrer nofollow\">\u0441\u043a\u0435\u043b\u0435\u0442<\/a> \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435. <\/p>\n<p>\u041a\u0430\u043a \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0441\u0430\u043b\u043c\u0430 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0438\u0441\u044c \u043e\u0431\u043e \u043c\u043d\u0435, \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u044f, \u0438 \u0440\u0435\u0448\u0438\u043b \u0447\u0442\u043e \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u043a\u043e.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437 \u0441\u043a\u0435\u043b\u0435\u0442\u0430, \u044f \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0438 \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043d\u0438\u0431\u0443\u0434\u044c \u0444\u0430\u0439\u043b \u043a\u0430\u043a \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0443 \u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0441\u0442\u044b \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u044f \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b \u043b\u0435\u0433\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043b\u0430\u0433\u0438\u043d\u0430. \u0417\u0430\u0433\u043b\u044f\u043d\u0443\u0432 \u0432 \u043a\u043e\u0434 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u043d\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412\u0435\u0437\u0434\u0435 \u0432\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u0442\u0435\u0441\u0442\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u041d\u043e \u0441\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043c\u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0437\u0436\u0435, \u044f \u0441\u0430\u043c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043b \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u043e\u043c\u0435 \u044e\u043d\u0438\u0442 \u0438 <a href=\"https:\/\/habr.com\/ru\/companies\/yandex\/articles\/491038\/\" rel=\"noopener noreferrer nofollow\">Testsuite<\/a> \u0442\u0435\u0441\u0442\u043e\u0432, \u0438 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0432 \u0441\u043a\u0435\u043b\u0435\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <strong>acceptance<\/strong>! \u041c\u043e\u0433 \u0431\u044b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432 )<\/p>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0438\u0441\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u044f \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0433 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u043b \u043a\u0443\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u0441\u0442<\/p>\n<pre><code class=\"elixir\">Feature: basics   Test my plugin    Background:     Given I have the following config       \"\"\"       &lt;?xml version=\"1.0\"?>       &lt;psalm totallyTyped=\"true\">         &lt;projectFiles>           &lt;directory name=\".\"\/>         &lt;\/projectFiles>         &lt;plugins>           &lt;pluginClass class=\"Tooeo\\PsalmPluginJms\\Plugin\" \/>         &lt;\/plugins>       &lt;\/psalm>       \"\"\"   Scenario: run without errors     Given I have the following code       \"\"\" &lt;?php  namespace Tooeo\\PsalmPluginJms\\Tests\\Fixtures;  class SomeTestFile {     \/**      * @JMS\\Type(array&lt;\\Api\\User\\Dto\\CurrencyError>);      * @psalm-suppress PropertyNotSetInConstructor      *\/     public string $errorArray; }       \"\"\"     When I run Psalm     Then I see these errors       | Type                 | Message                                                                             |       | UndefinedDocblockClass | Class \\Api\\User\\Dto\\CurrencyError does not exists                                   |            And I see no other errors <\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 \u0442\u043e \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<pre><code class=\"bash\"># \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b codecept build &amp;&amp; codecept --ansi run acceptance ..... \u2714 basics: run without errors (1.84s) \u2714 basics: run with errors (0.98s) \u2714 basics: run with suppressed errors (0.98s) ------------------------------------------------------------ Time: 00:03.825, Memory: 10.00 MB  OK (3 tests, 0 assertions)<\/code><\/pre>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u044f \u0434\u043e\u043f\u0438\u0441\u0430\u043b \u0438 \u043f\u0440\u0438\u0435\u043c\u043e\u0447\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043a \u043c\u043e\u0438\u043c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442\u0430\u043c.<\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438<\/h2>\n<p>\u0418\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f \u0443\u0437\u043d\u0430\u043b \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u043d\u0434\u043b\u0435\u0440(\u0438\u043b\u0438 \u0445\u0443\u043a). \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 \u043f\u0441\u0430\u043b\u043c\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u0445 \u043d\u0430\u0448\u0435\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"php\">&lt;?php class Plugin implements PluginEntryPointInterface {     public function __invoke(RegistrationInterface $psalm, ?SimpleXMLElement $config = null): void     {         require_once __DIR__ . '\/src\/Hooks\/JmsAnnotationCheckerHook.php';         $psalm->registerHooksFromClass(JmsAnnotationCheckerHook::class);     } }<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0445\u0435\u043d\u0434\u043b\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/psalm.dev\/docs\/running_psalm\/plugins\/authoring_plugins\/#psalm-api\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/a>, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f. <\/p>\n<p>\u042f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u043e\u0437\u0438\u043b\u0441\u044f \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u044f \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043d\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. <\/p>\n<p>\u0414\u043b\u044f \u0441\u0435\u0431\u044f \u044f \u0432\u044b\u0431\u0440\u0430\u043b <code>AfterClassLikeAnalysisInterface<\/code> \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043c\u043e\u0439 \u0445\u0443\u043a \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<h2>\u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 <code>AfterClassLikeAnalysisInterface<\/code>, \u0442\u043e \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>afterStatementAnalysis<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>AfterClassLikeAnalysisEvent<\/code><\/p>\n<pre><code class=\"php\">&lt;?php class JmsAnnotationCheckerHook implements AfterClassLikeAnalysisInterface {   public static function afterStatementAnalysis(AfterClassLikeAnalysisEvent $event)   {       \/**       * \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043b\u0430\u0441\u0441\u0435       * \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:       * - \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0435       * - \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432       * - \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u043e\u0432       * - \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u0435\u0439\u0442\u043e\u0432       * - \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432       *\/       $stmt = $event->getStmt();           \/**       * \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430       * \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:       * - \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441       * - \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b       * - \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435       * - \u0432\u0441\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u044b       * .....       * \u0412\u043e\u043e\u0431\u0449\u0435 \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e, \u0441\u0442\u043e\u0438\u0442 \u0432 \u043d\u0435\u0433\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c       *\/       $storage = $event->getClasslikeStorage();    } }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0426\u0438\u043a\u043b\u043e\u043c \u044f \u043f\u0440\u043e\u0448\u0435\u043b\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a \u043d\u0438\u043c \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0432 \u0441\u0442\u0438\u043b\u0435 JMS Serializer, \u0438 \u0435\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u0442\u043e \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u043e\u043d\u044f\u0442\u044c, \u0430 \u043a\u043b\u0430\u0441\u0441 \u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0442\u0438\u043f\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442. <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0447\u0438\u0442\u0430\u043b \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438.<\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e \u043a\u0430\u043a\u0438\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/p>\n<pre><code class=\"powershell\">\/* * @JMS\\Type(DateTime&lt;\\'Y-m-d\\'>) * @JMS\\Type(\"DateTime&lt;\\'d.m.Y H:i:s\\', \\'UTC\\'>\") * @JMS\\Type('string') * @JMS\\Type(name=\"string\") * @JMS\\Type(name=array&lt;int, enum&lt;JmsDto::class>>) * @JMS\\Type('\\Fixture\\JmsDto') * @JMS\\Type(array&lt;array&lt;string, DateTime&lt;\\'d.m.Y H:i:s\\', \\'UTC\\'>>>) *\/<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0438 \u0438\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>JmsDto::class<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043e\u043d, \u044f \u0438\u0441\u043a\u0430\u043b \u0435\u0433\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430\u0445. \u0422\u043e \u0435\u0441\u0442\u044c, \u0431\u0440\u0430\u043b \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 use \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u043b \u043a \u043d\u0435\u043c\u0443 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043d\u0430 class_exists. <\/p>\n<p>\u041b\u0443\u0447\u0448\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"php\">&lt;?php namespace Tooeo\\PsalmPluginJms\\Tests\\Fixtures;  use Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto; use Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto as JmsDtoAlias;  \/** * @var string $class - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u0430\u0440\u0441\u0438\u043b\u0438 \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f.  * \u041c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: * - Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto * - JmsDtoAlias * - FixturesAlias\\JmsDto::class * - SameNamespace::class * * @var array $uses - \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u043e\u0432 * \u041c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: *   $uses = [ *        'jmsdto' => 'Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto', *        'jmsdtoalias' => 'Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto', *   ]; * @var string $namespace - \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 * \u041c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: * - Tooeo\\PsalmPluginJms\\Tests\\Fixtures *\/ public static function isClassExists(string $class, array $uses, string $namespace): bool {       $class = explode('::', $class)[0];       foreach ($uses as $flipped => $use) {           if ($flipped === strtolower($class)) {               $class = $use;               break;           }       }       foreach ($uses as $flipped => $use) {           if (preg_match(\"#^$flipped#i\", $class)) {               $class = preg_replace(\"#$flipped#i\", $use, $class);               break;           }       }        return preg_match('#interface$#i', $class)           ? interface_exists($class) || interface_exists($namespace.'\\\\'.$class)           : class_exists($class) || class_exists($namespace.'\\\\'.$class); }<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u043c\u043e\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0435\u043c\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0443 \u0443\u0434\u0435\u043b\u044f\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/tooeo\/psalm-plugin-jms\/blob\/master\/src\/Hooks\/JmsAnnotationCheckerHook.php\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>.<\/p>\n<h2>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/h2>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432 JMS Serializer \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u0410 \u0438\u0445 \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043d\u0435 \u043e\u043f\u0438\u0448\u0435\u0448\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d.<\/p>\n<p>\u042d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438. \u0412 __invoke \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 SimpleXMLElement $config, \u0438 \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0443 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\">&lt;pluginClass xmlns=\"https:\/\/getpsalm.org\/schema\/config\" class=\"Tooeo\\PsalmPluginJms\\Plugin\">     &lt;ignoringTypes>         &lt;ignored>FeatureBasedDateTime&lt;\/ignored>         &lt;ignored>MixedType&lt;\/ignored>         &lt;ignored>ArrayOrString&lt;\/ignored>         &lt;ignored>float_amount&lt;\/ignored>         &lt;ignored>ContractType&lt;\/ignored>         &lt;ignored>DateTimeRFC3339&lt;\/ignored>     &lt;\/ignoringTypes> &lt;\/pluginClass><\/code><\/pre>\n<p>\u0410 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"php\">&lt;?php public function __invoke(RegistrationInterface $psalm, ?SimpleXMLElement $config = null): void {     foreach ($config?->ignoringTypes ?? [] as $toIgnore) {         \/\/ \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f     } }<\/code><\/pre>\n<h2>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0443\u043c\u0435\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438. \u0418 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c Psalm \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<p>\u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>IssueBuffer::maybeAdd()<\/code><em>.<\/em><\/p>\n<p>\u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044f \u043d\u0430\u0448\u0435\u043b \u043a\u043b\u0430\u0441\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0448\u0438\u0431\u043a\u0443 UndefinedDocblockClass \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u043e\u0434 \u0432\u0430\u0448\u0443.<\/p>\n<p>\u041e\u0441\u043e\u0431\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043b, \u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e 2-\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 <code>maybeAdd<\/code><em> \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <\/em>Suppressed, \u0438\u043d\u0430\u0447\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430. <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"php\">&lt;?php  \/\/ \u042d\u0442\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e. class CheckerHook implements AfterClassLikeAnalysisInterface {     public static function afterStatementAnalysis(AfterClassLikeAnalysisEvent $event)     {          foreach ($event->getClasslikeStorage()->properties as $name => $propertyStorage) {            \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430             if (!$property = $event->getStmt()->getProperty($name)) {                 continue;             }              \/\/ \u0421\u043e\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0438\u0433\u043d\u043e\u0440\u0438\u0442\u044c, \u044d\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430(\u043e\u0431\u0449\u0430\u044f) \u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430             $suppressed = array_merge(                 $event->getClasslikeStorage()->suppressed_issues,                 $propertyStorage->suppressed_issues             );              \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438.              \/\/ \u041e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442 $suppressed \u0438 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0439 \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0443             IssueBuffer::maybeAdd(                 new UndefinedDocblockClass(                     'My first validation Issue',                     $propertyStorage->stmt_location,                     $name \/\/ \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0438 \u043d\u0430 \u0447\u0442\u043e \u043e\u043d \u0432\u043b\u0438\u044f\u0435\u0442. \u041c\u043e\u0436\u0435\u0442 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442\u0435?                 ),                 $suppressed,                 true             );                     }     } }<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u044f \u043d\u0430\u0448\u0435\u043b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u043a\u043e\u0434\u0435. \u0414\u0430 \u044d\u0442\u043e \u0431\u044b\u043b \u043b\u0435\u0433\u0430\u0441\u0438 \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435, \u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u0442\u043e \u0442\u043e \u043c\u043e\u0433 \u043d\u0430\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0431\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. <\/p>\n<h2>\u0418\u0442\u043e\u0433<\/h2>\n<p>\u042f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043b\u0438\u043d\u0442\u0435\u0440\u0430 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b \u043d\u0435 \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0435\u0441\u044c \u0441 \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u044f\u0442\u044c\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d, \u044d\u0442\u043e \u0432\u0435\u0434\u044c \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0418 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0441\u0442\u0430\u043d\u0435\u0442 \u043c\u043d\u043e\u0433\u043e, \u0431\u0430\u0433\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430\u0445 \u043c\u0438\u0440\u0430 \u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442 \ud83d\ude42 <\/p>\n<p>\u0415\u0449\u0435 \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0440\u0435\u0441\u043f\u0435\u043a\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c Psalm, \u0437\u0430 \u0442\u043e \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0438\u0441\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e. \u0415\u0449\u0435 \u0431\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0448\u0435, \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u044f\u043c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/757188\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u041a\u0430\u043a\u0438\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f PHP \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u0432\u044b?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">40.63% <\/span><span class=\"tm-article-poll__answer-label\">Psalm<\/span><span class=\"tm-article-poll__answer-votes\">13<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 40.63%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">59.38% <\/span><span class=\"tm-article-poll__answer-label\">PHPStan<\/span><span class=\"tm-article-poll__answer-votes\">19<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 59.38%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">3.13% <\/span><span class=\"tm-article-poll__answer-label\">Phan<\/span><span class=\"tm-article-poll__answer-votes\">1<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 3.13%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">0% <\/span><span class=\"tm-article-poll__answer-label\">Exakat<\/span><span class=\"tm-article-poll__answer-votes\">0<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 0%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">18.75% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0438\u043a\u0430\u043a\u0438\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e, \u043f\u0438\u0448\u0443 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a<\/span><span class=\"tm-article-poll__answer-votes\">6<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 18.75%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">0% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0440\u0443\u0433\u043e\u0435, \u043d\u0430\u043f\u0438\u0448\u0443 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445<\/span><span class=\"tm-article-poll__answer-votes\">0<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 0%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 32 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.    \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 3 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/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\/articles\/757188\/\"> https:\/\/habr.com\/ru\/articles\/757188\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0430\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e. \u041e\u0431 \u0438\u0445 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044f\u0445 \u0434\u043b\u044f PHP \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/habr.com\/ru\/companies\/badoo\/articles\/426605\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0410 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434 \u0432\u0430\u0448\u0438 \u043d\u0443\u0436\u0434\u044b, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Psalm.<\/p>\n<p>\u0412 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u043e \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0438 \u043e\u0434\u0438\u043d \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043c\u043e\u0447\u044c. \u0418 \u0437\u0434\u0435\u0441\u044c \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431 \u043e\u043f\u044b\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0442\u044c\u044f.<\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c <a href=\"https:\/\/www.jmsyst.com\/libs\/serializer\" rel=\"noopener noreferrer nofollow\">JMS Serializer<\/a> \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435 \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 JSON\/XML \u0434\u0430\u043d\u043d\u044b\u0445, \u0433\u0434\u0435 \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043c\u0430\u043f\u043b\u0435\u043d\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON\/XML.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0434\u0435\u0441\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"php\">&lt;?php  class ExampleDTO {       \/**        * @JMS\\Type(\"int\")        *\/          public $id;          \/**        *  @JMS\\Type(\"\\ExampleTypeDTO\")        *\/          public $type; }<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0434\u0435\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f $type \u043e\u043f\u0438\u0441\u0430\u043d \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0430, \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u043b\u0438\u043d\u0442\u0435\u0440 \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0435\u0433\u043e, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043b\u0430\u0441\u0441.<\/p>\n<p>\u0418 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433, \u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e. \u0418 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0435\u0441\u0442\u044b, \u0438 \u0432\u044b \u043f\u043b\u043e\u0445\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0432 \u0442\u0435\u0441\u0442\u0438\u043d\u0433\u0435 \u0438\u043b\u0438 \u0445\u0443\u0436\u0435, \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435.<\/p>\n<h2>\u041a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c?<\/h2>\n<p>\u041d\u0430\u0447\u0430\u043b \u044f \u0441<a href=\"https:\/\/psalm.dev\/docs\/running_psalm\/plugins\/authoring_plugins\/\" rel=\"noopener noreferrer nofollow\"> \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0437\u043d\u0430\u043b \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/psalm\/psalm-plugin-skeleton\" rel=\"noopener noreferrer nofollow\">\u0441\u043a\u0435\u043b\u0435\u0442<\/a> \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435. <\/p>\n<p>\u041a\u0430\u043a \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0441\u0430\u043b\u043c\u0430 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0438\u0441\u044c \u043e\u0431\u043e \u043c\u043d\u0435, \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u044f, \u0438 \u0440\u0435\u0448\u0438\u043b \u0447\u0442\u043e \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u043a\u043e.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437 \u0441\u043a\u0435\u043b\u0435\u0442\u0430, \u044f \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0438 \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043d\u0438\u0431\u0443\u0434\u044c \u0444\u0430\u0439\u043b \u043a\u0430\u043a \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0443 \u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0441\u0442\u044b \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u044f \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b \u043b\u0435\u0433\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043b\u0430\u0433\u0438\u043d\u0430. \u0417\u0430\u0433\u043b\u044f\u043d\u0443\u0432 \u0432 \u043a\u043e\u0434 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u043d\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412\u0435\u0437\u0434\u0435 \u0432\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u0442\u0435\u0441\u0442\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u041d\u043e \u0441\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043c\u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0437\u0436\u0435, \u044f \u0441\u0430\u043c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043b \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u043e\u043c\u0435 \u044e\u043d\u0438\u0442 \u0438 <a href=\"https:\/\/habr.com\/ru\/companies\/yandex\/articles\/491038\/\" rel=\"noopener noreferrer nofollow\">Testsuite<\/a> \u0442\u0435\u0441\u0442\u043e\u0432, \u0438 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0432 \u0441\u043a\u0435\u043b\u0435\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <strong>acceptance<\/strong>! \u041c\u043e\u0433 \u0431\u044b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432 )<\/p>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0438\u0441\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u044f \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0433 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u043b \u043a\u0443\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u0441\u0442<\/p>\n<pre><code class=\"elixir\">Feature: basics   Test my plugin    Background:     Given I have the following config       \"\"\"       &lt;?xml version=\"1.0\"?>       &lt;psalm totallyTyped=\"true\">         &lt;projectFiles>           &lt;directory name=\".\"\/>         &lt;\/projectFiles>         &lt;plugins>           &lt;pluginClass class=\"Tooeo\\PsalmPluginJms\\Plugin\" \/>         &lt;\/plugins>       &lt;\/psalm>       \"\"\"   Scenario: run without errors     Given I have the following code       \"\"\" &lt;?php  namespace Tooeo\\PsalmPluginJms\\Tests\\Fixtures;  class SomeTestFile {     \/**      * @JMS\\Type(array&lt;\\Api\\User\\Dto\\CurrencyError>);      * @psalm-suppress PropertyNotSetInConstructor      *\/     public string $errorArray; }       \"\"\"     When I run Psalm     Then I see these errors       | Type                 | Message                                                                             |       | UndefinedDocblockClass | Class \\Api\\User\\Dto\\CurrencyError does not exists                                   |            And I see no other errors <\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 \u0442\u043e \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<pre><code class=\"bash\"># \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b codecept build &amp;&amp; codecept --ansi run acceptance ..... \u2714 basics: run without errors (1.84s) \u2714 basics: run with errors (0.98s) \u2714 basics: run with suppressed errors (0.98s) ------------------------------------------------------------ Time: 00:03.825, Memory: 10.00 MB  OK (3 tests, 0 assertions)<\/code><\/pre>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u044f \u0434\u043e\u043f\u0438\u0441\u0430\u043b \u0438 \u043f\u0440\u0438\u0435\u043c\u043e\u0447\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043a \u043c\u043e\u0438\u043c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442\u0430\u043c.<\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438<\/h2>\n<p>\u0418\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f \u0443\u0437\u043d\u0430\u043b \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u043d\u0434\u043b\u0435\u0440(\u0438\u043b\u0438 \u0445\u0443\u043a). \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 \u043f\u0441\u0430\u043b\u043c\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u0445 \u043d\u0430\u0448\u0435\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"php\">&lt;?php class Plugin implements PluginEntryPointInterface {     public function __invoke(RegistrationInterface $psalm, ?SimpleXMLElement $config = null): void     {         require_once __DIR__ . '\/src\/Hooks\/JmsAnnotationCheckerHook.php';         $psalm->registerHooksFromClass(JmsAnnotationCheckerHook::class);     } }<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0445\u0435\u043d\u0434\u043b\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/psalm.dev\/docs\/running_psalm\/plugins\/authoring_plugins\/#psalm-api\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/a>, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f. <\/p>\n<p>\u042f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u043e\u0437\u0438\u043b\u0441\u044f \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u044f \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043d\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. <\/p>\n<p>\u0414\u043b\u044f \u0441\u0435\u0431\u044f \u044f \u0432\u044b\u0431\u0440\u0430\u043b <code>AfterClassLikeAnalysisInterface<\/code> \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043c\u043e\u0439 \u0445\u0443\u043a \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<h2>\u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 <code>AfterClassLikeAnalysisInterface<\/code>, \u0442\u043e \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>afterStatementAnalysis<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>AfterClassLikeAnalysisEvent<\/code><\/p>\n<pre><code class=\"php\">&lt;?php class JmsAnnotationCheckerHook implements AfterClassLikeAnalysisInterface {   public static function afterStatementAnalysis(AfterClassLikeAnalysisEvent $event)   {       \/**       * \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043b\u0430\u0441\u0441\u0435       * \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:       * - \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0435       * - \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432       * - \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u043e\u0432       * - \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u0435\u0439\u0442\u043e\u0432       * - \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432       *\/       $stmt = $event->getStmt();           \/**       * \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430       * \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:       * - \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441       * - \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b       * - \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435       * - \u0432\u0441\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u044b       * .....       * \u0412\u043e\u043e\u0431\u0449\u0435 \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e, \u0441\u0442\u043e\u0438\u0442 \u0432 \u043d\u0435\u0433\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c       *\/       $storage = $event->getClasslikeStorage();    } }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0426\u0438\u043a\u043b\u043e\u043c \u044f \u043f\u0440\u043e\u0448\u0435\u043b\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a \u043d\u0438\u043c \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0432 \u0441\u0442\u0438\u043b\u0435 JMS Serializer, \u0438 \u0435\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u0442\u043e \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u043e\u043d\u044f\u0442\u044c, \u0430 \u043a\u043b\u0430\u0441\u0441 \u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0442\u0438\u043f\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442. <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0447\u0438\u0442\u0430\u043b \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438.<\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e \u043a\u0430\u043a\u0438\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/p>\n<pre><code class=\"powershell\">\/* * @JMS\\Type(DateTime&lt;\\'Y-m-d\\'>) * @JMS\\Type(\"DateTime&lt;\\'d.m.Y H:i:s\\', \\'UTC\\'>\") * @JMS\\Type('string') * @JMS\\Type(name=\"string\") * @JMS\\Type(name=array&lt;int, enum&lt;JmsDto::class>>) * @JMS\\Type('\\Fixture\\JmsDto') * @JMS\\Type(array&lt;array&lt;string, DateTime&lt;\\'d.m.Y H:i:s\\', \\'UTC\\'>>>) *\/<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0438 \u0438\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>JmsDto::class<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043e\u043d, \u044f \u0438\u0441\u043a\u0430\u043b \u0435\u0433\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430\u0445. \u0422\u043e \u0435\u0441\u0442\u044c, \u0431\u0440\u0430\u043b \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 use \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u043b \u043a \u043d\u0435\u043c\u0443 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043d\u0430 class_exists. <\/p>\n<p>\u041b\u0443\u0447\u0448\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"php\">&lt;?php namespace Tooeo\\PsalmPluginJms\\Tests\\Fixtures;  use Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto; use Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto as JmsDtoAlias;  \/** * @var string $class - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u0430\u0440\u0441\u0438\u043b\u0438 \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f.  * \u041c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: * - Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto * - JmsDtoAlias * - FixturesAlias\\JmsDto::class * - SameNamespace::class * * @var array $uses - \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u043e\u0432 * \u041c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: *   $uses = [ *        'jmsdto' => 'Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto', *        'jmsdtoalias' => 'Tooeo\\PsalmPluginJms\\Tests\\Fixtures\\JmsDto', *   ]; * @var string $namespace - \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 * \u041c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: * - Tooeo\\PsalmPluginJms\\Tests\\Fixtures *\/ public static function isClassExists(string $class, array $uses, string $namespace): bool {       $class = explode('::', $class)[0];       foreach ($uses as $flipped => $use) {           if ($flipped === strtolower($class)) {               $class = $use;               break;           }       }       foreach ($uses as $flipped => $use) {           if (preg_match(\"#^$flipped#i\", $class)) {               $class = preg_replace(\"#$flipped#i\", $use, $class);               break;           }       }        return preg_match('#interface$#i', $class)           ? interface_exists($class) || interface_exists($namespace.'\\\\'.$class)           : class_exists($class) || class_exists($namespace.'\\\\'.$class); }<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u043c\u043e\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0435\u043c\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0443 \u0443\u0434\u0435\u043b\u044f\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/tooeo\/psalm-plugin-jms\/blob\/master\/src\/Hooks\/JmsAnnotationCheckerHook.php\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>.<\/p>\n<h2>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/h2>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432 JMS Serializer \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u0410 \u0438\u0445 \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043d\u0435 \u043e\u043f\u0438\u0448\u0435\u0448\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d.<\/p>\n<p>\u042d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438. \u0412 __invoke \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 SimpleXMLElement $config, \u0438 \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0443 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\">&lt;pluginClass xmlns=\"https:\/\/getpsalm.org\/schema\/config\" class=\"Tooeo\\PsalmPluginJms\\Plugin\">     &lt;ignoringTypes>         &lt;ignored>FeatureBasedDateTime&lt;\/ignored>         &lt;ignored>MixedType&lt;\/ignored>         &lt;ignored>ArrayOrString&lt;\/ignored>         &lt;ignored>float_amount&lt;\/ignored>         &lt;ignored>ContractType&lt;\/ignored>         &lt;ignored>DateTimeRFC3339&lt;\/ignored>     &lt;\/ignoringTypes> &lt;\/pluginClass><\/code><\/pre>\n<p>\u0410 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"php\">&lt;?php public function __invoke(RegistrationInterface $psalm, ?SimpleXMLElement $config = null): void {     foreach ($config?->ignoringTypes ?? [] as $toIgnore) {         \/\/ \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f     } }<\/code><\/pre>\n<h2>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0443\u043c\u0435\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-353279","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/353279","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=353279"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/353279\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=353279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=353279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=353279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}