PHP рдореЗрдВ IoC

рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрд▓рдЯрд╛ (IoC) рдХрдВрдЯреЗрдирд░ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ PHP рдореЗрдВ IoC рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:

interface First { public function first(); } interface Second { public function second(); } interface Third { public function third(); } 


рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 class Foo implements First { public function first() { /* ... */ } } class Boo implements Second { public function __construct(First $first) { /* ... */ } public function second() { /* ... */ } } class Woo implements Third { public function __construct(First $first, Second $first) { /* ... */ } public function third() { /* ... */ } } 


рдЕрдм рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЗрдУрд╕реА рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 $ioc = IoC\Container::getInstance(); $ioc->register('Foo'); $ioc->register('Boo'); $ioc->register('Woo'); 


рдЖрд╢реНрд░рд┐рддреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдлреВ рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рдПрдХ IoC рдХрдВрдЯреЗрдирд░ рдореЗрдВ, рдкрд╣рд▓реЗ рдлреВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдмрдВрдзрдХ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:

 class Manager { use IoC\Creatable; public function __construct(First $first, Second $second, Third $third) { /* ... */ } } 


рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ:

 $manager = Manager::create(); 


рдЖрдИрдУрд╕реА рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рддреБрд░рдВрдд рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред

рдЕрдЧрд░ рдХреЛрдИ PHP 5.4 рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class Manager { public static function create() { return \IoC\Factory::create(get_called_class(), func_get_args()); } /* ... */ } 


рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рднреА, рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class Manager { use IoC\Creatable; public function __construct(First $first, Second $second, Third $third, $value, $anotherValue = 'default') { /* ... */ } } 


рдФрд░ рдЕрднреА рднреА IoC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 $manager = Manager::create('value', 'another value'); $managerWithDefault = Manager::create('value'); 


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рд╕рдВрджрд░реНрдн, рдЖрд▓рд╕реА рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред

рдЖрд▓рд╕реА рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ:
 $ioc->register('Foo'); 

рдлреВ рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рддрднреА рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдмрдирд╛рдПрдБ () рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлреВ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣рд░ рдЬрдЧрд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
 $ioc->register(new Foo()); 


рдпрджрд┐ рдХреНрд▓рд╛рд╕ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдХреНрд▓реЛрди рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдирдИ рд╡рд╕реНрддреБрдПрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВ), рддреЛ рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛:
 $ioc->prototype(new Foo()); 

рд╣рд░ рдмрд╛рд░ рдмрдирд╛рдиреЗ () рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд▓реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдлреВ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрдШреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
 $ioc->assoc(new MyAssoc('Foo')); 


IoC рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 $ioc->register('Foo', 'First'); $ioc->register(new Foo(), 'Second'); $ioc->prototype('Foo', 'First'); 


рдПрдХрд╛рдзрд┐рдХ рд╕рдВрдШред рдпрджрд┐ FooBoo рд╡рд░реНрдЧ рджреЛ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ:

 $ioc->register('FooBoo', array('First', 'Second')); 


рдЖрдк рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдШреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 //  Boo extends Foo $ioc->register('Boo', 'Foo'); 


рдЧрд┐рдЯрд╣рдм рдкрд░рд┐рдпреЛрдЬрдирд╛

PHP рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп IoC рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

PHP рдкреЛрд░реНрдЯ рдкрд┐рдХреЛ рдХрдВрдЯреЗрдирд░
Phemto
рд╢рд░рдмрдд

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


All Articles