рдбрд┐рдЬрд╛рдЗрдирд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЛ рддреЛрдбрд╝рдирд╛ - PHP рдореЗрдВ рд╕рд┐рдВрдЧрд▓рдЯрди

рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдп рджрд┐рд╡рд╕, рдореИрдВрдиреЗ рдЙрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдХрд╛рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдХреЗ рдХреБрдЫ рдирд┐рдЬреА рдЧреБрдгреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рдерд╛ред


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


рдореБрдЭреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рдорд┐рд▓рд╛, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ dg / bypass-finalals рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд┐рдо рд╡рд░реНрдЧ рдХреЛ рд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдЖрдпрд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ PHPUnit рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред


рдкрд░рд╛рд╡рд░реНрддрди рдХрд░рдиреЗ рдкрд░, рдореБрдЭреЗ Closure рд╡рд░реНрдЧ рдпрд╛рдж рдЖрдпрд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рд╕реНрдЯреИрдЯрд┐рдХ bind() рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬреЛ рдПрдХ рд╡рд░реНрдЧ рдХреА рдЗрдЪреНрдЫрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдирд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдИ рдЬреЛ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА (рд╢рд╛рдпрдж рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рднреА рд╣реЛрдЧреА)


 trait PrivatePropertySetterTrait { protected function assignValue($object, string $attribute, $value) { $setter = function ($value) use ($attribute) { $this->$attribute = $value; }; $setterClosure = \Closure::bind($setter, $object, \get_class($object)); $setterClosure($value); } } 

рдпрд╣ рдЧреБрдг рдПрдХ рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддрд╛ рд╣реИ, рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдЬрд╣рд╛рдВ рдЖрдк рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрд╡рдпрдВ рдореВрд▓реНрдпред рдЕрдЧрд▓рд╛, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ $this рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рд╡рд░реНрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, Closure рдХреНрд▓рд╛рд╕ рдЕрдкрдиреА рд╕реНрдерд┐рд░ bind() рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдПрдХ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди, рдФрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдкреВрд░рд╛ рдирд╛рдоред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реЛрддрд╛ рд╣реИ рдФрд░ bind() рд╡рд┐рдзрд┐ рд╣рдореЗрдВ Closure рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рджреВ __invoke() рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╡реЛрдЗрд▓рд╛!


рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рд╕рд┐рдВрдЧреНрд▓рдЯрди рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдпрд╛рдж рдЖрдпрд╛ред рдХреНрдпрд╛ рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдХреА рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛? рдмреЗрд╢рдХ рдореИрдВ рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдЧрдпрд╛ рдерд╛!


рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрдХрд░


рдПрдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕реИрдВрдбрдмреЙрдХреНрд╕

 <?php final class Singleton { private static $instance; public static function getInstance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } private function __construct() { } private function __clone() { } private function __wakeup() { } } $s1 = Singleton::getInstance(); \var_dump(\spl_object_id($s1)); $createNewInstance = function () { return new self(); }; $newInstanceClosure = Closure::bind($createNewInstance, $s1, Singleton::class); $s2 = $newInstanceClosure(); \var_dump(\spl_object_id($s2)); 

рдЬреЛ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд░реНрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, new рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред \spl_object_id() рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред spl_object_id() рдФрд░ var_dump() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ var_dump() рдореИрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдЕрд▓рдЧ рд╣реИрдВ! рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдФрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛!


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдмрд╣реБрдд рд╣реА рдЙрддреНрд╕реБрдХ рдЦреЛрдЬ рдХреЛ PHP рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред


рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles