{"id":804,"date":"2017-11-24T15:39:55","date_gmt":"2017-11-24T12:39:55","guid":{"rendered":"http:\/\/langtoday.com\/?p=804"},"modified":"2019-01-28T12:15:41","modified_gmt":"2019-01-28T09:15:41","slug":"php-%d0%b8-%d0%bd%d0%b5%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d0%b5%d0%bc%d0%be%d1%81%d1%82%d1%8c-%d1%8d%d0%ba%d0%b7%d0%b5%d0%bc%d0%bf%d0%bb%d1%8f%d1%80%d1%8b-%d0%ba%d0%be%d1%82%d0%be%d1%80%d1%8b","status":"publish","type":"post","link":"https:\/\/langtoday.com\/?p=804","title":{"rendered":"PHP \u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0427\u0430\u0441\u0442\u044c 2"},"content":{"rendered":"<p>\u042d\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0421\u0430\u0439\u043c\u043e\u043d\u0430 \u0425\u043e\u043b\u0438\u0432\u0435\u043b\u043b\u0430&nbsp;<a href=\"https:\/\/www.simonholywell.com\/post\/2017\/04\/php-and-immutability-part-two\/\">PHP and Immutability<\/a>. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u2014 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0441\u0442\u0435. \u041d\u0430\u0447\u0430\u043b\u043e &#8212; <a href=\"https:\/\/langtoday.com\/?p=735\" target=\"_blank\" rel=\"noopener\">\u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435<\/a>.<\/p>\n<p>\u0412 <a href=\"https:\/\/langtoday.com\/?p=735\" target=\"_blank\" rel=\"noopener\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 PHP. \u0411\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u043c\u044b \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0438 \u0434\u0430\u0432\u0430\u043b \u0431\u044b \u043f\u0440\u043e\u0449\u0435 \u0441\u043e\u0437\u0430\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043e\u043f\u0438\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435.<!--more--><\/p>\n<h2>\u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435, \u0432\u044b \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0425\u043e\u0442\u044f, \u044b\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0438\u0445 \u0432 \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0440\u0438 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438.<\/p>\n<pre class=\"lang:default decode:true\">$a = new Immutable('\u0422\u0435\u0441\u0442');\necho $a-&gt;getX(); \/\/ \u0422\u0435\u0441\u0442\n$b = new Immutable($a-&gt;getX() . ' \u043e\u043f\u044f\u0442\u044c');\necho $b-&gt;getX(); \/\/ \u0422\u0435\u0441\u0442 \u043e\u043f\u044f\u0442\u044c<\/pre>\n<p>\u0422\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e&#8230; \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e!<\/p>\n<p>\u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0441 \u0442\u0430\u043a\u0438\u043c \u043c\u0430\u043b\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 5 \u0438\u043b\u0438 10 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438? \u0412\u043e\u0442 \u0443\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre class=\"lang:default decode:true\">$a = new Immutable('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K');\necho $a-&gt;getK(); \/\/ K\n$b = new Immutable(\n    $a-&gt;getA(), $a-&gt;getB(), $a-&gt;getC(), $a-&gt;getD(), $a-&gt;getE(), $a-&gt;getF(),\n    $a-&gt;getG(), $a-&gt;getH(), $a-&gt;getI(), $a-&gt;getJ(), $a-&gt;getK() . ' \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435'\n);\necho $b-&gt;getK(); \/\/ K \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435<\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u043e \u043b\u0438\u0447\u043d\u043e \u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0435\u0441\u043b\u0438 \u044f \u0441\u043c\u043e\u0433\u0443 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0433\u043d\u0443\u0442\u044c.<\/p>\n<h2>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/h2>\n<p>\u0412 PHP \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u0440\u043e\u0439 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0435\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u0430\u043a \u0432\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u044b \u0432 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u041e\u041e\u041f, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u043e\u043d \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 (\u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435) \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u0430-\u0434\u0430, \u0432\u044b \u043f\u0440\u043e\u0447\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430!<\/p>\n<p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0432\u044b \u0438\u0437\u0443\u0447\u0430\u043b\u0438, \u0447\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u044c (private) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u0438\u043b\u0438 \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0445 \u0435\u0433\u043e. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0442\u0430\u043a \u0438 \u0435\u0441\u0442\u044c, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 (private) \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<pre class=\"lang:php decode:true \">$a = new Immutable('A', 'B');\necho $a-&gt;getB(); \/\/ B\n$b = clone $a;\n$b-&gt;B = '22';\n\/\/ Fatal error: Cannot access private property Immutable::$B<\/pre>\n<p>\u0422\u0430\u043a&#8230; \u042d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e! \u042f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0442\u0430\u043a \u043c\u0435\u043d\u044f\u0442\u044c,&nbsp; \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0442\u043e\u0433\u043e \u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<pre class=\"lang:php decode:true\">declare(strict_types=1);\n\nfinal class Immutable {\n    private $x;\n    private $mutable = true;\n    public function __construct(string $input) {\n        if (false === $this-&gt;mutable) {\n            throw new \\BadMethodCallException('\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u044b \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0432\u0430\u0436\u0434\u044b.');\n        }\n        $this-&gt;x = $input;\n        $this-&gt;mutable = false;\n    }\n    public function getX(): string {\n        return $this-&gt;x;\n    }\n    public function withX(string $input): Immutable {\n        $clonedClass = clone $this;\n        $clonedClass-&gt;x = $input;\n        return $clonedClass;\n    }\n}\n$a = new Immutable('TEST');\necho $a-&gt;getX(); \/\/ TEST\n$b = $a-&gt;withX('noop');\necho $b-&gt;getX(); \/\/ noop<\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043b\u0435\u0433\u0447\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 &#8212; \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c <span class=\"lang:default decode:true crayon-inline \">clone&nbsp;&nbsp;<\/span>&nbsp; \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441 \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<h2>\u041f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/h2>\n<p>\u0415\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043d\u0430\u043f\u043e\u0440\u0442\u0430\u0447\u0438\u0442\u044c \u0441 \u044f\u043a\u043e\u0431\u044b \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0430\u0440\u044b \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 PHP.<\/p>\n<p>\u0412 PHP \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a \u043a\u043b\u0430\u0441\u0441\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b &#8212; \u0434\u0430\u0436\u0435 \u043a \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 (final) \u043a\u043b\u0430\u0441\u0441\u0443. \u042d\u0442\u043e\u0433\u043e \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e \u0431\u044b \u0444\u043e\u0440\u043c\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u0431\u044b \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c &#8212; \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u043a\u043b\u0430\u0441\u0441\u0443 \u043f\u0443\u0441\u0442\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <span class=\"lang:default decode:true crayon-inline \">__set()<\/span>&nbsp; .<\/p>\n<pre class=\"lang:php decode:true \">public function __set(string $id, $val): void {\n        return;\n}<\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043d\u0443\u0442\u0440\u043a\u0446\u0438\u0438 <span class=\"lang:default decode:true crayon-inline \">unset()<\/span>&nbsp;. \u041c\u044b \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre class=\"lang:php decode:true\">public function __unset(string $id): void {\n        return;\n}<\/pre>\n<p>\u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0438 \u0432\u0435\u0449\u0438. \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043e\u043d\u0438 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043e\u043d\u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 (public) \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u041a\u043b\u0430\u0441\u0441 \u043d\u0435 \u0431\u044b\u043b \u0431\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f.<\/p>\n<h2>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/h2>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u0441\u0442\u0438\u043b\u0435 <span class=\"lang:default decode:true crayon-inline \">withX<\/span>&nbsp;, \u043d\u043e \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0449\u0435? \u041d\u0443 \u0432\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<pre class=\"lang:php decode:true \">$a = new MyFantasyImmutable('TEST', 'foo');\necho $a-&gt;getX(); \/\/ TEST\necho $a-&gt;getY(); \/\/ foo\n$b = $a-&gt;withX('noop')-&gt;withY('bar');\necho $b-&gt;getX(); \/\/ noop\necho $b-&gt;getY(); \/\/ bar<\/pre>\n<p>\u0425\u043e\u0442\u044f \u044d\u0442\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435. \u041c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 <span class=\"lang:default decode:true crayon-inline \">withX()<\/span>&nbsp; \u0438 <span class=\"lang:default decode:true crayon-inline \">withY()<\/span>&nbsp; \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <span class=\"lang:default decode:true crayon-inline \">with*()<\/span>&nbsp;<code><\/code>\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0447\u043d\u0435\u0442 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0442\u044c.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<pre class=\"lang:php decode:true\">declare(strict_types=1);\n\nfinal class Bike {\n    private $engineCc, $brakes, $tractionControl;\n    private $mutable = true;\n    public function __construct(int $engineCc, string $brakes, bool $tractionControl) {\n        if (false === $this-&gt;mutable) {\n            throw new \\BadMethodCallException('\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0432\u0430\u0436\u0434\u044b.');\n        }\n        $this-&gt;engineCc = $engineCc;\n        $this-&gt;brakes = $brakes;\n        $this-&gt;tractionControl = $tractionControl;\n        $this-&gt;mutable = false;\n    }\n    public function __get($property) {\n        if (property_exists($this, $property)) {\n            return $this-&gt;$property;\n        }\n    }\n    public function __set(string $id, $val): void {\n        return;\n    }\n    \n    public function __unset(string $id): void {\n        return;\n    }\n}<\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u044b\u043b \u043a\u043e\u0440\u043e\u0447\u0435, \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 <span class=\"lang:default decode:true crayon-inline \">__get() <\/span>&nbsp;\u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f get-\u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430. \u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u0431\u044b \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0432\u0440\u043e\u0434\u0435 <span class=\"lang:default decode:true crayon-inline \">getEngineCc()<\/span>&nbsp;, <span class=\"lang:default decode:true crayon-inline \">getBrakes()<\/span>&nbsp;&nbsp;\u0438<span class=\"lang:default decode:true crayon-inline \">getTractionControl()<\/span>&nbsp;. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u043a \u043d\u0438\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043a\u0430\u043a \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c.<\/p>\n<pre class=\"lang:php decode:true\">$zx9r = new Bike(900, '2 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0440\u0448\u043d\u0435\u0432\u044b\u0445 \u0434\u0438\u0441\u043a\u0430', false);\necho $zx9r-&gt;engineCc; \/\/ 900\necho $zx9r-&gt;brakes; \/\/ 2 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0440\u0448\u043d\u0435\u0432\u044b\u0445 \u0434\u0438\u0441\u043a\u0430\n\n$cagivaRaptor = new Bike(1000, '2 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0440\u0448\u043d\u0435\u0432\u044b\u0445 \u0434\u0438\u0441\u043a\u0430', false);\nvar_dump($cagivaRaptor-&gt;tractionControl); \/\/ bool(false)<\/pre>\n<p>\u041d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c! \u0427\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u0438 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u043a\u043b\u0430\u0441\u0441\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<pre class=\"tab-convert:true lang:php decode:true\">    public function with(array $args): Bike {\n        $clonedClass = clone $this;\n        foreach($args as $property =&gt; $value) {\n            if (property_exists($clonedClass, $property)) {\n                $clonedClass-&gt;$property = $value;\n            }\n        }\n        return $clonedClass;\n    }<\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u043c\u0438 &#8212; \u043c\u043e\u0436\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043d\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u043f\u0435\u0434\u0430 &#8212; \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <span class=\"lang:default decode:true crayon-inline \">with() <\/span>&nbsp;\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432.<\/p>\n<pre class=\"lang:php decode:true\">$zx9r = new Bike(900, '\u041f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0439 2-\u043f\u043e\u0440\u0448\u043d\u0435\u0432\u043e\u0439', false);\n$zx10r = $zx9r-&gt;with(['engineCc' =&gt; 1000, 'tractionControl' =&gt; true]);\necho $zx10r-&gt;engineCc; \/\/ 1000\necho $zx10r-&gt;brakes; \/\/ \u041f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0439 2-\u043f\u043e\u0440\u0448\u043d\u0435\u0432\u043e\u0439\nvar_dump($zx10r-&gt;tractionControl); \/\/ bool(true)<\/pre>\n<p>\u0425\u043e\u0442\u044f \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u0437\u0430\u0431\u0440\u0430\u043b\u0438 \u0443 PHP \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0438\u043f \u0432\u0432\u043e\u0434\u0430. \u041c\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>\u042d\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0443\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u043d\u0435\u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435).<\/p>\n<p>&nbsp;<\/p>\n<p>\u041e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b &#8212; \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c with() \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Reflection, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u0441\u043b\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre class=\"lang:php decode:true\">    public function with(array $args): Bike {\n        $reflection = new ReflectionMethod($this, '__construct');\n        $new_parameters = array_map(function($param) use ($args) {\n            $x = $param-&gt;name;\n            return (array_key_exists($x, $args))\n                ? $args[$x] \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n                : $this-&gt;$x; \/\/ \u043e\u0442\u043a\u0430\u0442 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e\n        }, $reflection-&gt;getParameters());\n        return new self(...$new_parameters);\n    }<\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u043e\u0432\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, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e, \u0447\u0442\u043e \u0438\u0445 \u0442\u0438\u043f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <span class=\"lang:default decode:true crayon-inline \">with()<\/span>&nbsp;. \u041e\u043d \u0436\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043c\u0435\u044e\u0442 \u0442\u0435 \u0436\u0435 \u0438\u043c\u0435\u043d\u0430, \u043a\u0430\u043a \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <span class=\"lang:default decode:true crayon-inline \">$this-&gt;engineC<\/span>&nbsp;&nbsp;&#8212; \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 <span class=\"lang:default decode:true crayon-inline \">$engineCc<\/span>&nbsp;<code><\/code>).<\/p>\n<p>\u042d\u0442\u043e \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <span class=\"lang:default decode:true crayon-inline \">Bike<\/span>&nbsp;:<\/p>\n<pre class=\"lang:php decode:true\">declare(strict_types=1);\n\nfinal class Bike {\n    private $engineCc, $brakes, $tractionControl;\n    private $mutable = true;\n    public function __construct(int $engineCc, string $brakes, bool $tractionControl) {\n        if (false === $this-&gt;mutable) {\n            throw new \\BadMethodCallException('\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0432\u0430\u0436\u0434\u044b.');\n        }\n        $this-&gt;engineCc = $engineCc;\n        $this-&gt;brakes = $brakes;\n        $this-&gt;tractionControl = $tractionControl;\n        $this-&gt;mutable = false;\n    }\n    public function __get($property) {\n        if (property_exists($this, $property)) {\n            return $this-&gt;$property;\n        }\n    }\n    public function with(array $args): Bike {\n        $reflection = new ReflectionMethod($this, '__construct');\n        $new_parameters = array_map(function($param) use ($args) {\n            $x = $param-&gt;name;\n            return (array_key_exists($x, $args))\n                ? $args[$x] \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n                : $this-&gt;$x; \/\/ \u043e\u0442\u043a\u0430\u0442 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e\n        }, $reflection-&gt;getParameters());\n        return new self(...$new_parameters);\n    }\n    public function __set(string $id, $val): void {\n        return;\n    }\n    \n    public function __unset(string $id): void {\n        return;\n    }\n}<\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435, \u0447\u0442\u043e Reflection API, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435 PHP, \u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0448\u0443\u0441\u0442\u0440\u043e\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043a \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0435\u0433\u043e \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u0441\u0435 \u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0443\u0434\u0430\u0440, \u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0442\u0438\u043f \u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u0433\u043e.<\/p>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h2>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u042d\u0442\u043e \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u0431\u0435\u0433\u043d\u0443\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f&nbsp;Reflection API, \u043d\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0442\u0438\u043f. \u0415\u0441\u0442\u044c \u0434\u043e\u043b\u044f \u0438\u0440\u043e\u043d\u0438\u0438 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0439\u0442\u0435\u0441\u044c \u0441\u043e \u043c\u043d\u043e\u0439&#8230;<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0448 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c. \u042f \u0437\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u0443\u0431\u0438\u0440\u0430\u044e \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <span class=\"lang:default decode:true crayon-inline \">__get(),<\/span>&nbsp; \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u0432 \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 IDE \u0432 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u0445 \u043f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u043a\u043e\u0434\u0430 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430 &#8212; \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043b\u0435\u0433\u0447\u0435 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:php decode:true\">declare(strict_types=1);\n\nfinal class Bike {\n    private $engineCc, $brakes, $tractionControl;\n    private $mutable = true;\n    public function __construct(int $engineCc, string $brakes, bool $tractionControl) {\n        if (false === $this-&gt;mutable) {\n            throw new \\BadMethodCallException('\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0432\u0430\u0436\u0434\u044b.');\n        }\n        $this-&gt;engineCc = $engineCc;\n        $this-&gt;brakes = $brakes;\n        $this-&gt;tractionControl = $tractionControl;\n        $this-&gt;mutable = false;\n    }\n    public function getEngineCc(): int {\n        return $this-&gt;engineCc;\n    }\n    public function getBrakes(): string {\n        return $this-&gt;brakes;\n    }\n    public function getTractionControl(): bool{\n        return $this-&gt;tractionControl;\n    }\n    public function __set(string $id, $val): void {\n        return;\n    }\n    \n    public function __unset(string $id): void {\n        return;\n    }\n}<\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u042d\u0442\u043e\u0442 \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <span class=\"lang:default decode:true crayon-inline \">Bike<\/span>&nbsp;.<\/p>\n<pre class=\"lang:php decode:true \">class BikeGenerator {\n    private $engineCc, $brakes, $tractionControl;\n    public static function create(): self {\n        return new self;\n    }\n    public static function with(Bike $oldBike): self {\n        $generator = new self;\n        $generator-&gt;setEngineCc($oldBike-&gt;getEngineCc());\n        $generator-&gt;setBrakes($oldBike-&gt;getBrakes());\n        $generator-&gt;setTractionControl($oldBike-&gt;getTractionControl());\n        return $generator;\n    }\n    \n    public function setEngineCc(int $cc): self {\n        $this-&gt;engineCc = $cc;\n        return $this;\n    }\n    public function setBrakes(string $brakes): self {\n        $this-&gt;brakes = $brakes;\n        return $this;\n    }\n    public function setTractionControl(bool $tractionControl): self {\n        $this-&gt;tractionControl = $tractionControl;\n        return $this;\n    }\n    public function build(): Bike {\n        return new Bike($this-&gt;engineCc, $this-&gt;brakes, $this-&gt;tractionControl);\n    }\n}<\/pre>\n<p><span class=\"lang:default decode:true crayon-inline \">BikiGenerator<\/span>&nbsp; \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u0443\u0436\u0438\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0441\u043b\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041c\u044b \u0441\u0442\u0430\u0432\u0438\u043c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u043c\u0441\u044f, \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c <span class=\"lang:default decode:true crayon-inline \">build()<\/span>&nbsp;, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <span class=\"lang:default decode:true crayon-inline \">Bike<\/span>&nbsp;.<\/p>\n<pre class=\"lang:php decode:true\">$zx9r = BikeGenerator::create()\n  -&gt;setEngineCc(900)\n  -&gt;setBrakes('2 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0440\u0448\u043d\u0435\u0432\u044b\u0445 \u0434\u0438\u0441\u043a\u0430')\n  -&gt;setTractionControl(false)\n  -&gt;build();\n\necho $zx9r-&gt;getEngineCc(); \/\/ 900\necho $zx10r-&gt;getBrakes(); \/\/ 2 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0440\u0448\u043d\u0435\u0432\u044b\u0445 \u0434\u0438\u0441\u043a\u0430\nvar_dump($zx10r-&gt;getTractionControl()); \/\/ bool(false)\n\n$zx10r = BikeGenerator::with($zx9r)\n  -&gt;setEngineCc(1000)\n  -&gt;setBrakes($zx9r-&gt;getBrakes() . ' ABS')\n  -&gt;setTractionControl(true)\n  -&gt;build();\n  \necho $zx10r-&gt;getEngineCc(); \/\/ 1000\necho $zx10r-&gt;getBrakes(); \/\/ 2 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0440\u0448\u043d\u0435\u0432\u044b\u0445 \u0434\u0438\u0441\u043a\u0430 ABS\nvar_dump($zx10r-&gt;getTractionControl()); \/\/ bool(true)<\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0432 \u0434\u0435\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <span class=\"lang:default decode:true crayon-inline \">Bike<\/span>&nbsp;. \u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <span class=\"lang:default decode:true crayon-inline \">::with()<\/span>&nbsp;, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<h2>\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/h2>\n<p>\u0412\u044b \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0443\u043a\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u0445 \u0432 PHP. \u041e\u0434\u043d\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0451 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.<\/p>\n<pre class=\"lang:php decode:true\">declare(strict_types=1);\n\nfinal class Config {\n    private $properties = [\n        \/\/ \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e =&gt; \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445\n        \/\/ \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u043d\u0435 \u0437\u0430\u0434\u0430\u043d = \u0441\u0442\u0440\u043e\u043a\u0430\n        'name',\n        'version'   =&gt; 'int',\n        'released'  =&gt; 'bool',\n        'licence',\n        'private'   =&gt; 'bool',\n        'url',\n        'repo',\n        'downloads' =&gt; 'int'\n    ];\n    private $data = [];\n    private $mutable = true;\n    public function __construct(array $values) {\n        if (false === $this-&gt;mutable) {\n            throw new \\Exception('\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0432\u0430\u0436\u0434\u044b.');\n        }\n        $this-&gt;set($values);\n        $this-&gt;mutable = false;\n    }\n    \n    public function __get($property) {\n        if (array_key_exists($property, $this-&gt;data)) {\n            return $this-&gt;data[$property];\n        }\n        throw new \\Exception('\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e ' . $property . ' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442');\n    }\n    \n    private function set(array $values) {\n        foreach($this-&gt;properties as $prop =&gt; $type) {\n            if (!is_string($prop)) {\n                \/\/ \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0437\u0430 \u0441\u0442\u0440\u043e\u043a\u0443, \u0435\u0441\u043b\u0438 \u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u044f\u0432\u043d\u043e \u043d\u0435 \u0437\u0430\u0434\u0430\u043d \u0442\u0438\u043f\n                $prop = $type;\n                $type = 'string';\n            }\n            \n            if (array_key_exists($prop, $values)) {\n                $this-&gt;setValue($prop, $type, $values[$prop]);\n            }\n        }\n    }\n    \n    private function setValue($prop, $type, $value) {\n        $check = 'is_' . $type; \/\/ eg. is_int()\n        if ($check($value)) {\n            $this-&gt;data[$prop] = $value;\n        } else {\n            throw new \\InvalidArgumentException('\u041f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \"' . $prop . '\" - \u043e\u0436\u0438\u0434\u0430\u043b\u0441\u044f ' . $type . ' , \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 ' . gettype($prop));\n        }\n    }\n    public function __set(string $id, $val): void {\n        return;\n    }\n    \n    public function __unset(string $id): void {\n        return;\n    }\n}<\/pre>\n<p>\u041c\u044b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0431\u044b\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432 \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 &#171;\u0440\u0443\u0447\u043d\u043e\u0439&#187; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0442\u0438\u043f \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <span class=\"lang:default decode:true crayon-inline \">$properties<\/span>&nbsp; \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <span class=\"lang:default decode:true crayon-inline \">setValue()<\/span>&nbsp;.<\/p>\n<pre class=\"lang:php decode:true\">$c = new Config([\n    'name' =&gt; 'foo',\n    'version' =&gt; '10'\n]);\n\/\/ Uncaught InvalidArgumentException: \u041f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \"version\" - \u043e\u0436\u0438\u0434\u0430\u043b\u0441\u044f int , \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 string<\/pre>\n<p>\u0422\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 &#8212; \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0432\u0441\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0431\u044b\u043b\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438. \u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0438 \u043e\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <span class=\"lang:default decode:true crayon-inline \">$this-&gt;data<\/span>&nbsp;.<\/p>\n<pre class=\"lang:php decode:true\">$c = new Config([\n    'name' =&gt; 'foo',\n    'version' =&gt; 10\n]);\necho $c-&gt;name; \/\/ foo\necho $c-&gt;version; \/\/ 10\necho $c-&gt;repo; \/\/ Uncaught Exception: \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e repo \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442<\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043b\u0443\u0447\u0448\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0441 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u043d\u043e \u044d\u0442\u043e \u0441\u043e\u0439\u0434\u0435\u0442 \u0437\u0430 \u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 <span class=\"lang:default decode:true crayon-inline \">set()<\/span>&nbsp; \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0438\u0445\u043e \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <span class=\"lang:default decode:true crayon-inline \">$properties<\/span>&nbsp;. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/h2>\n<p>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0441\u0435\u0439\u0447\u0430\u0441, \u0432\u0435\u0434\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0438 \u043c\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0430 \u0432\u0445\u043e\u0434. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441 <span class=\"lang:default decode:true crayon-inline \">Config<\/span>&nbsp;.<\/p>\n<pre class=\"lang:php decode:true \">    public function with(array $values): Config {\n        return new self(array_merge($this-&gt;data, $values));\n    }<\/pre>\n<p>\u042d\u0442\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre class=\"lang:php decode:true \">$c = new Config([\n    'name' =&gt; 'foo',\n    'version' =&gt; 10,\n    'repo' =&gt; 'github.com',\n]);\necho $c-&gt;name; \/\/ foo\necho $c-&gt;version; \/\/ 10\necho $c-&gt;repo; \/\/ github.com\n\n$c2 = $c-&gt;with(['name' =&gt; 'bar', 'version' =&gt; 12]);\necho $c2-&gt;name; \/\/ bar\necho $c2-&gt;version; \/\/ 12\necho $c2-&gt;repo; \/\/ github.com<\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0441 \u043f\u0440\u0438\u0441\u0443\u0449\u0438\u043c\u0438 \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 \u043e\u043a\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u0440\u044f\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0442\u0438\u043f\u043e\u0432 \u0432 IDE.<\/p>\n<p>\u041d\u0443 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0434\u043e \u0432\u0430\u0441 \u0434\u043e\u0448\u043b\u043e, \u0447\u0442\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 PHP \u043c\u043e\u0433\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0442\u044c. \u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u043d\u0435\u0442 \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0443\u0442\u0435\u0439 \u0438\u0437\u0431\u0435\u0433\u043d\u0443\u0442\u044c \u043d\u0430\u0431\u043e\u0440\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u0434\u0430 \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435 \u0438\/\u0438\u043b\u0438 \u0434\u0443\u0440\u043d\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 IDE \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u043a\u043e\u0434\u0430. \u0417\u0434\u0435\u0441\u044c \u0431\u044b\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0444\u0440\u0443\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u042d\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0421\u0430\u0439\u043c\u043e\u043d\u0430 \u0425\u043e\u043b\u0438\u0432\u0435\u043b\u043b\u0430&nbsp;PHP and Immutability. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u2014 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0441\u0442\u0435. \u041d\u0430\u0447\u0430\u043b\u043e &#8212; \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 PHP. \u0411\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u043c\u044b \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0438 \u0434\u0430\u0432\u0430\u043b \u0431\u044b \u043f\u0440\u043e\u0449\u0435 \u0441\u043e\u0437\u0430\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31],"tags":[45,93,134],"class_list":["post-804","post","type-post","status-publish","format-standard","hentry","category-php","tag-php","tag-93","tag-134"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/langtoday.com\/index.php?rest_route=\/wp\/v2\/posts\/804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/langtoday.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/langtoday.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/langtoday.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/langtoday.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=804"}],"version-history":[{"count":10,"href":"https:\/\/langtoday.com\/index.php?rest_route=\/wp\/v2\/posts\/804\/revisions"}],"predecessor-version":[{"id":1257,"href":"https:\/\/langtoday.com\/index.php?rest_route=\/wp\/v2\/posts\/804\/revisions\/1257"}],"wp:attachment":[{"href":"https:\/\/langtoday.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/langtoday.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/langtoday.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}