рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрд▓рдЯрд╛ (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'));
рдЖрдк рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдШреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
рдЧрд┐рдЯрд╣рдм рдкрд░рд┐рдпреЛрдЬрдирд╛PHP рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп IoC рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
PHP рдкреЛрд░реНрдЯ рдкрд┐рдХреЛ рдХрдВрдЯреЗрдирд░Phemtoрд╢рд░рдмрдд