рд╡рд┐рд╖рдп рдХреЛ рдЫреЗрджрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ ... рд╢рд╛рдпрдж, рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореИрдВ рдЗрд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрднреА-рдЕрднреА рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдХреЛрдб рд╕реЗ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИ рдФрд░ рд╡рд╣ рдЗрд╕ рджреВрд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ - "рдкреИрдЯрд░реНрди" рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдкрдХреНрд╡ рд╣реИрдВред рдореБрдЭреЗ рдЦреБрдж рдпрд╛рдж рд╣реИ рдХрд┐ рдХрд╛рдлреА рд╕рдордп рддрдХ рдореИрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрд▓рдЭрддрд╛ рд░рд╣рд╛, рдХрднреА-рдХрднреА рдпрд╣ рднреА рдирд╣реАрдВ рд╕рдордЭ рдкрд╛рддрд╛ рдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рддрдереНрдп рдореЗрд░реЗ рд▓реЗрдЦ рдХрд╛ рдЖрдзрд╛рд░ рдмрди рдЧрдпрд╛ред рдЗрд╕рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд╡реЗ рдЕрдореВрд░реНрдд рдФрд░ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдВрддрд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХреЗрдВред рдореИрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдПрдВ рд▓реЛрдб рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рд╕рдордЭ рд╕рдХреЗрдВ рдХрд┐ рдХреЛрдб рдХрд╛ рдХреМрди рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕реАрдзреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдирд╛рдпрдХ рдХрд╛рд░рдЦрд╛рдиреЗ (рдлреИрдХреНрдЯрд░реА) рдФрд░ рдЙрддреНрдкрд╛рдж (рдЗрд╕ рдХрд╛рд░рдЦрд╛рдиреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдЙрддреНрдкрд╛рдж) рд╣реЛрдВрдЧреЗред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВред рд╢рд╛рдпрдж рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ ...
рд▓реЗрдЦ рдХреЛ рдХрдИ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ, рдореИрдВ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рдЬрд┐рд╕ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдкреВрдЫрддрд╛ рд╣реВрдВред
рдЬрдирд░реЗрдЯрд┐рд╡ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди
рдЖрдкрдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЙрди рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реВрдБ, рдЬреЛ рдЗрди рдЬреЗрдирд░рд┐рдХ рдкреИрдЯрд░реНрди рдХреЗ рд╣реИрдВ ... рдореИрдВ
рдпрд╣рд╛рдБ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдПрдХ
рд▓рд┐рдВрдХ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдБред Brevity рдкреНрд░рддрд┐рднрд╛ рдХреА рдмрд╣рди рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рддреБрд░рдВрдд рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рд░рдЬрд┐рд╕реНрдЯреНрд░реА (рд░рдЬрд┐рд╕реНрдЯреНрд░реА)
рдореИрдВ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рдкрдВрдХреНрддрд┐ рд╕реЗ рдереЛрдбрд╝рд╛ рдмрд╛рд╣рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ рдЙрд╕рдХреЗ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рддреЛ, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдПрдХ рд╣реИрд╢ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдг 1<?php class Product { protected static $data = array(); public static function set($key, $value) { self::$data[$key] = $value; } public static function get($key) { return isset(self::$data[$key]) ? self::$data[$key] : null; } final public static function removeProduct($key) { if (array_key_exists($key, self::$data)) { unset(self::$data[$key]); } } } Product::set('name', 'First product'); print_r(Product::get('name'));
рдЕрдХреНрд╕рд░ рдЖрдк рдЙрди рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрд░реЗрдЕрд╕реЗрдХ рдФрд░ / рдпрд╛ рдЗрдЯрд░реЗрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╢рд╛рдирджрд╛рд░ рд╣реИред рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред
рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓
рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдПрдХ рд╣реИрд╢ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬреНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЙрджрд╛рд╣рд░рдг 2 <?php class Factory { protected static $products = array(); public static function pushProduct(Product $product) { self::$products[$product->getId()] = $product; } public static function getProduct($id) { return isset(self::$products[$id]) ? self::$products[$id] : null; } public static function removeProduct($id) { if (array_key_exists($id, self::$products)) { unset(self::$products[$id]); } } } class Product { protected $id; public function __construct($id) { $this->id = $id; } public function getId() { return $this->id; } } Factory::pushProduct(new Product('first')); Factory::pushProduct(new Product('second')); print_r(Factory::getProduct('first')->getId());
рдПрдХрд▓ (рд╕рд┐рдВрдЧрд▓рдЯрди)
рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рд░ рдХреЛрдИ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЬрдм рдХрд╛рдо рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
рдЙрджрд╛рд╣рд░рдг 3 <?php final class Product { private static $instance; public $a; public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self(); } return self::$instance; } private function __construct() { } private function __clone() { } private function __sleep() { } private function __wakeup() { } } $firstProduct = Product::getInstance(); $secondProduct = Product::getInstance(); $firstProduct->a = 1; $secondProduct->a = 2; print_r($firstProduct->a);
рд╕рд┐рдВрдЧрд▓рдЯрди рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд╛рдБрдЪ рд╕реЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рд╣реИред
рдЙрддреНрдкрд╛рдж рд╡рд░реНрдЧ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ, рдХреНрд▓реЛрдирд┐рдВрдЧ рдФрд░ рдХреНрд░рдорд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рддрд░реАрдХрд╛ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ
рдЙрддреНрдкрд╛рдж :: getInstance () ред рдкрд╣рд▓реА рдХреЙрд▓ рдкрд░, рдХреНрд▓рд╛рд╕ рдЦреБрдж рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░ рд▓реЗрдЧреА рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреИрдЯрд┐рдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧреА
рдЙрддреНрдкрд╛рдж :: $ рдЙрджрд╛рд╣рд░рдг ред рдмрд╛рдж рдХреА рдХреЙрд▓ рдкрд░, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд┐рдзрд┐ рд╡рд╣реА, рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ, рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓реМрдЯрд╛рдПрдЧреАред
рдореИрдВрдиреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ $ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рддрд╛рдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЕрдХреЗрд▓рд╛ рдХрд╛рдо рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ $ FirstProduct рдФрд░ $ SecondProduct рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИрдВред
рд╕рд┐рдВрдЧрд▓ рдкреВрд▓ (рдорд▓реНрдЯреАрдЯрди)
рд╢рд╛рдпрдж рдХреЛрдИ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд┐рдВрдЧреНрд▓реЗрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рдлрд┐рд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЖрдЗрдП "рд▓реЛрдиреЗрд░" рдФрд░ "рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓" рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
рдЙрджрд╛рд╣рд░рдг 4.1 <?php abstract class FactoryAbstract { protected static $instances = array(); public static function getInstance() { $className = static::getClassName(); if (!(self::$instances[$className] instanceof $className)) { self::$instances[$className] = new $className(); } return self::$instances[$className]; } public static function removeInstance() { $className = static::getClassName(); if (array_key_exists($className, self::$instances)) { unset(self::$instances[$className]); } } final protected static function getClassName() { return get_called_class(); } protected function __construct() { } final protected function __clone() { } final protected function __sleep() { } final protected function __wakeup() { } } abstract class Factory extends FactoryAbstract { final public static function getInstance() { return parent::getInstance(); } final public static function removeInstance() { parent::removeInstance(); } } class FirstProduct extends Factory { public $a = []; } class SecondProduct extends FirstProduct { }
рдЗрд╕рд▓рд┐рдП, рдПрдХ рдирдП рдПрдХрд▓ рд╡рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╕ рдЗрд╕реЗ
рдлрд╝реИрдХреНрдЯрд░реА рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рджреЛ рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдИрдВ рдФрд░ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХрд╛ рдЕрдкрдирд╛ рдЕрдиреВрдард╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдпрд╣ рд╕рдВрдпреЛрдЧ рд╕реЗ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЛ рджреЛ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ред рдЕрдм рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдХреЗрд▓реЗрдкрди рдкреИрджрд╛ рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг 4.2 <?php abstract class RegistryFactory extends FactoryAbstract { final public static function getInstance($id) { $className = static::getClassName(); if (isset(self::$instances[$className])) { if (!(self::$instances[$className][$id] instanceof $className)) { self::$instances[$className][$id] = new $className($id); } } else { self::$instances[$className] = [ $id => new $className($id), ]; } return self::$instances[$className][$id]; } final public static function removeInstance($id = null) { $className = static::getClassName(); if (isset(self::$instances[$className])) { if (is_null($id)) { unset(self::$instances[$className]); } else { if (isset(self::$instances[$className][$id])) { unset(self::$instances[$className][$id]); } if (empty(self::$instances[$className])) { unset(self::$instances[$className]); } } } } protected function __construct($id) { } } class FirstFactory extends RegistryFactory { public $a = []; } class SecondFactory extends FirstFactory { }
рдХреБрдЫ рдУрдЖрд░рдПрдо рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдФрд░ рдЖрд░рдВрднрд┐рдХ рдореЙрдбрд▓ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдЕрдм, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЬрд╛рдП, рдореИрдВ рд╕рдкрдиреЗ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рд╕реНрд╡рд░реНрдЧ рд╕реЗ рдкреГрдереНрд╡реА рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдКрдВрдЧрд╛ред рд▓реЛрдирд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рдЗрд╕рдХреЗ рдЙрдиреНрдирдд рднрд╛рдИ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рднреВрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдФрд░ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд╡рд╣рд╛рдВ рдЗрд╕реЗ рдореВрд░реНрддрд┐рдХрд▓рд╛ рджреЗрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ (рдпрд╛ рдмрддрд╛рдирд╛) рдХрд┐ рдПрдХ рдРрд╕реА рдПрдВрдЯреАрдкреИрд░реНрдЯрди рд╣реИ, "рдЕрдХреЗрд▓рд╛рдкрди" (рд╕рд┐рдВрдЧрд▓рдЯрдирдЯрд╛рдЗрдЯрд┐рд╕), рдЬреЛ рд╕рд┐рд░реНрдл рд╕рд┐рдВрдЧреЛрд▓реЗрдЯреНрд╕ рдХреЗ рдЕрдиреБрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИред рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╕рдмрд╕реЗ рдЖрдо рдЙрджрд╛рд╣рд░рдг рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдХрдИ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рдЕрдХреЗрд▓рд╛ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред
рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐
рдФрд░ рдЕрдм рдореИрдВ рдбрд┐рдЧреНрд░реА рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЬрдбрд╝реЛрдВ рдХреА рдУрд░ рд▓реМрдЯрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдлреИрдХреНрдЯреНрд░реА рдЗрд╕ рдЙрддреНрдкрд╛рдж рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдмрдирд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдг 5 <?php interface Factory { public function getProduct(); } interface Product { public function getName(); } class FirstFactory implements Factory { public function getProduct() { return new FirstProduct(); } } class SecondFactory implements Factory { public function getProduct() { return new SecondProduct(); } } class FirstProduct implements Product { public function getName() { return 'The first product'; } } class SecondProduct implements Product { public function getName() { return 'Second product'; } } $factory = new FirstFactory(); $firstProduct = $factory->getProduct(); $factory = new SecondFactory(); $secondProduct = $factory->getProduct(); print_r($firstProduct->getName());
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
getProduct () рд╡рд┐рдзрд┐ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИред
рд╕рд╛рд░ рдХрд╛рд░рдЦрд╛рдирд╛
рдПрдХ рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдХрд╛рд░рдЦрд╛рдиреЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг 6 <?php class Config { public static $factory = 1; } interface Product { public function getName(); } abstract class AbstractFactory { public static function getFactory() { switch (Config::$factory) { case 1: return new FirstFactory(); case 2: return new SecondFactory(); } throw new Exception('Bad config'); } abstract public function getProduct(); } class FirstFactory extends AbstractFactory { public function getProduct() { return new FirstProduct(); } } class FirstProduct implements Product { public function getName() { return 'The product from the first factory'; } } class SecondFactory extends AbstractFactory { public function getProduct() { return new SecondProduct(); } } class SecondProduct implements Product { public function getName() { return 'The product from second factory'; } } $firstProduct = AbstractFactory::getFactory()->getProduct(); Config::$factory = 2; $secondProduct = AbstractFactory::getFactory()->getProduct(); print_r($firstProduct->getName());
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдлреИрдХреНрдЯреНрд░реА рд▓реЗрдиреА рд╣реИред рдЕрдореВрд░реНрдд рдХрд╛рд░рдЦрд╛рдирд╛ рд╕реНрд╡рдпрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░рдЦрд╛рдирд╛ рджреЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЕрдореВрд░реНрдд рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдкрд╕рдВрдж рдХрд╛ рддрд░реНрдХ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрд▓рд╕реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ
рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд┐рддрд┐ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХрд┐рд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдХреМрди рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХ рдСрдкрд░реЗрд╢рди рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдЬрдм рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░:
рдЙрджрд╛рд╣рд░рдг 7 <?php interface Product { public function getName(); } class Factory { protected $firstProduct; protected $secondProduct; public function getFirstProduct() { if (!$this->firstProduct) { $this->firstProduct = new FirstProduct(); } return $this->firstProduct; } public function getSecondProduct() { if (!$this->secondProduct) { $this->secondProduct = new SecondProduct(); } return $this->secondProduct; } } class FirstProduct implements Product { public function getName() { return 'The first product'; } } class SecondProduct implements Product { public function getName() { return 'Second product'; } } $factory = new Factory(); print_r($factory->getFirstProduct()->getName());
рдЬрдм рд╡рд┐рдзрд┐ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░рдЦрд╛рдирд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдлрд┐рд░ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдорд╛рдкреНрдд рд╣реБрдИ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдордиреЗ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдХрд╣рд╛ рд╣реЛрддрд╛, рддреЛ рд╡рд╕реНрддреБ рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛рддреАред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдБ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕рдХрд╛ рдорддрд▓рдм рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдЧрдгрдирд╛, рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдХрдИ рдПрдХреНрд╕реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЦрдкрдд рд╣реЛрддреА рд╣реИред рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк (рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк)
рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрдИ рдмрд╛рд░ рдмрдирд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдЙрдирдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдордп рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╡рд╕реНрддреБ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдпрд╣ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдг 8 <?php interface Product { } class Factory { private $product; public function __construct(Product $product) { $this->product = $product; } public function getProduct() { return clone $this->product; } } class SomeProduct implements Product { public $name; } $prototypeFactory = new Factory(new SomeProduct()); $firstProduct = $prototypeFactory->getProduct(); $firstProduct->name = 'The first product'; $secondProduct = $prototypeFactory->getProduct(); $secondProduct->name = 'Second product'; print_r($firstProduct->name);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рджреЛ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ред
рдмрд┐рд▓реНрдбрд░ (рдмрд┐рд▓реНрдбрд░)
рдЦреИрд░, рдЖрдЬ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрд┐рд▓реНрдбрд░ рд╣реИред рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рд╕рд┐рд░реНрдл рдЙрд╕ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрддреНрдкрд╛рдж рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реМрдВрдкрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдбрд░:
рдЙрджрд╛рд╣рд░рдг 9 <?php class Product { private $name; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } class Factory { private $builder; public function __construct(Builder $builder) { $this->builder = $builder; $this->builder->buildProduct(); } public function getProduct() { return $this->builder->getProduct(); } } abstract class Builder { protected $product; final public function getProduct() { return $this->product; } public function buildProduct() { $this->product = new Product(); } } class FirstBuilder extends Builder { public function buildProduct() { parent::buildProduct(); $this->product->setName('The product of the first builder'); } } class SecondBuilder extends Builder { public function buildProduct() { parent::buildProduct(); $this->product->setName('The product of second builder'); } } $firstDirector = new Factory(new FirstBuilder()); $secondDirector = new Factory(new SecondBuilder()); print_r($firstDirector->getProduct()->getName());
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ 9 рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЛ рджреЗрдЦрд╛ред рдпрд╣ рдПрдХ рд▓рдВрдмрд╛ рд▓реЗрдЦ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреА рд░рд╛рдп рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХреНрдпрд╛ рдХрд╛рдо рдореЗрдВ рдХреЛрдИ рд╕рдордЭрджрд╛рд░реА рд╣реИ рдФрд░ рдХреНрдпрд╛ рдореБрдЭреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреИрдЯрд░реНрди рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдХреЗ рдЪрдХреНрд░ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рд╕рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЛрдб
рдЧрд┐рдердм рдкрд░ рднреА
рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред