PHP рдореЗрдВ рд╕рд░рдгреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░

рд▓реЗрдЦ рдХрд╛ рд╕реНрддрд░: рд╢реБрд░реБрдЖрддреА / рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ

PHP рдореЗрдВ рдПрдХ рд╕рд░рдгреА рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп (рд╢рдмреНрджрдХреЛрд╢) рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдПрдХ рдорд┐рд╢реНрд░рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд░реИрдЦрд┐рдХ рд╕рд░рдгреА (рд╕реВрдЪреА) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рддреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рд╕рд░рдгреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдпрджрд┐ рдпрд╣ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "5"), рддреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░, рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ - рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдзрд╛рд░ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХрднреА-рдХрднреА рдореИрдВ рдЙрдирдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХрд╛ рдПрдХ рд╕рдорд╛рди рдЯреБрдХрдбрд╝рд╛, рд╕рдВрднрд╡рддрдГ, рдЕрдзрд┐рдХрд╛рдВрд╢ php рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

$foo = isset($array['foo']) ? $array['foo'] : null; $bar = isset($array['bar']) ? $array['bar'] : null; 


рдЗрд╕ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЫреЛрдЯреА рдЯрд░реНрдирд░реА рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП:

 $foo = $array['foo'] ? : null; $bar = $array['bar'] ? : null; 


рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреБрдВрдЬреА рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдорд╛рдорд▓реЗ рдореЗрдВ PHP рдиреЛрдЯрд┐рд╕ рдХреЛ рдлреЗрдВрдХ рджреЗрдВрдЧреЗ, рдФрд░ рдореИрдВ рдХреЛрдб рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд╛рдл рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ - error_reporting = E_ALL рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реЗрдЯ рд╣реИред рдФрд░ рдпрд╣ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдареАрдХ рд╣реИ рдХрд┐ ArrayObject рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ - рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рд╕рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рд╡рд┐рд░рд╛рд╕рдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЖрдЗрдП рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред



рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдЬрд┐рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, ArrayObject рд╣рдо ArrayObject рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреЗрд╕ рд╡рдВрд╢рдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:


DefaultingArrayObject



рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рд░рдгреА рдЬрдм рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ, рдЬрдм dict.get(key, default) рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрджрд┐ рдХреБрдВрдЬреА рдХреЛ рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╣рдо рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдПрдХ рд╣реА рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдХреБрдВрдЬреА рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

DefaultingArrayObject рдХреНрд▓рд╛рд╕ рдХреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
 class DefaultingArrayObject extends \ArrayObject { protected $default = null; public function offsetGet($index) { if ($this->offsetExists($index)) { return parent::offsetGet($index); } else { return $this->getDefault(); } } /** * @param mixed $default * @return $this */ public function setDefault($default) { $this->default = $default; return $this; } /** * @return mixed */ public function getDefault() { return $this->default; } } 



рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:

 $array = new DefaultingArrayObject($array); $foo = $array['foo']; $bar = $array['bar']; 


рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛, рдФрд░ рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ рдХрд┐ рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдкреВрд░реНрдг рдЯрд░реНрдирд░реА рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ - рдореИрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ (PHP 5.4+):

 $array = new DefaultingArrayObject($array); $foo = $array->setDefault('default for foo')['foo']; $bar = $array->setDefault('default for bar')['bar']; 


ExceptionArrayObject



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, PHP рд╕рд░рдгреА рдореЗрдВ рдХреЛрдИ рдХреБрдВрдЬреА рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдиреЛрдЯрд┐рд╕ рдлреЗрдВрдХ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдк рд╕рд╢рд░реНрдд рдмрдпрд╛рдиреЛрдВ рдХреЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рддрд░реНрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рдХреЛрдб:

 if (isset($array['foo']) && isset($array['bar'] && isset($array['baz'])) { // logic that uses foo, bar and baz array values } else { // logic that does not use foo, bar and baz array values } 


рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 $array = new ExceptionArrayObject($array); try { // logic that uses foo, bar and baz array values } catch (UndefinedIndexException $e) { // logic that does not use foo, bar and baz array values } 


рдХреНрд▓рд╛рд╕ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд░рд╣рд╛ рд╣реИ ExceptionArrayObject
 class ExceptionArrayObject extends \ArrayObject { public function offsetGet($index) { if ($this->offsetExists($index)) { return parent::offsetGet($index); } else { throw new UndefinedIndexException($index); } } } 


 class UndefinedIndexException extends \Exception { protected $index; public function __construct($index) { $this->index = $index; parent::__construct('Undefined index "' . $index . '"'); } /** * @return string */ public function getIndex() { return $this->index; } } 



CallbackArrayObject



рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЧреИрд░-рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рд░рдгреАред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░рдгреА рдХреЛ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡ рдХреНрд▓реЛрдЬрд░ (рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рдВрд╕) рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдПрд░реЗ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рддрддреНрд╡ рдХреЗ рдмрдЬрд╛рдп рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:

 $array = new CallbackArrayObject([ 'foo' => function() { return 'foo ' . uniqid(); }, 'bar' => function() { return 'bar ' . time(); }, ]); $foo = $array['foo']; // "foo 526afed12969d" $bar = $array['bar']; // "bar 1382743789" 


CallbackArrayObject рдХрдХреНрд╖рд╛ рд╕реВрдЪреАрдХрд░рдг
 class CallbackArrayObject extends \ArrayObject { protected $initialized = array(); public function __construct(array $values) { foreach ($values as $key => $value) { if (!($value instanceof \Closure)) { throw new \RuntimeException('Value for CallbackArrayObject must be callback for key ' . $key); } } parent::__construct($values); } public function offsetGet($index) { if (!isset($this->initialized[$index])) { $this->initialized[$index] = $this->getCallbackResult(parent::offsetGet($index)); } return $this->initialized[$index]; } protected function getCallbackResult(\Closure $callback) { return call_user_func($callback); } } 



рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд░реНрд╡рд╛рдд рдореЗрдВ рдЧреЛрд▓рд╛рдХрд╛рд░ рдкрд░рд┐рдгрд╛рдо рдЕрддреНрдпрдВрдд рджреБрд░реНрд▓рдн рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 $array = new ConfigurableCallbackArrayObject([ 'foo' => function($config) { return 'foo ' . $config['foo']; }, 'bar' => function($config) { return 'bar ' . $config['bar']; }, ]); $array->setConfig(['foo' => 123, 'bar' => 321]); $foo = $array['foo']; // "foo 123" $bar = $array['bar']; // "bar 321" 


рд╢реНрд░реЗрдгреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп
 class ConfigurableCallbackArrayObject extends CallbackArrayObject { protected $config; protected function getCallbackResult(\Closure $callback) { return call_user_func($callback, $this->getConfig()); } public function setConfig($config) { $this->config = $config; } public function getConfig() { return $this->config; } } 



рдпрд╣ рд╕рдм рдореИрдВ ArrayObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐, рд╕рдм рдХреБрдЫ рдХреА рддрд░рд╣, ArrayObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдорд╛рдк рдЬрд╛рдирдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдореБрдЦреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд╕реАрдзреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд╕реАрдзреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдпрд╛ рддрд░реНрдХ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рд╕рд╣рд╛рдпрдХ рд▓реЛрдЧреЛрдВ рдореЗрдВ рдЗрдирдХреИрдк рдХрд┐рдПред рдХрдХреНрд╖рд╛рдПрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рди рдХрд░реЗрдВред

Source: https://habr.com/ru/post/In199096/


All Articles