рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди

рдЙрд▓рдЯрд╛ PHP 5.3 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрдВрдЯреЗрдирд░ рд╣реИред рд╕реЗрд╡рд╛ рдЙрдиреНрдореБрдЦ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рд▓рд┐рдВрдХ, PRS-0, рдФрд░ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред



рдЖрдк packagist.org: granula / inversion рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ PRS-0 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЧрдд рдмреВрдЯрд▓реЛрдбрд░ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЬреЛрдбрд╝рдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

$container = new Inversion\Container(); $container['foo'] = 'My\Class\Foo'; // ... $foo = $container('foo'); 


рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдо рдХрдВрдЯреЗрдирд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдореЗрдВ, рд╣рдо "рдлреВ" рдФрд░ рд╕реЗрд╡рд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЬреБрдбрд╝рд╛рд╡ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ "рдорд╛рдп \ рдХреНрд▓рд╛рд╕ \ рдлреВ" рд╢реНрд░реЗрдгреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕ рддрд░рд╣ рдФрд░ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 $container->addService(new Service('My\Class\Foo'), 'foo'); 

"рдлреВ" рдирд╛рдо рджреВрд╕рд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдиреАрдЪреЗред

рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдореЗрдВ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдФрд░ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 $foo = $container('foo'); //  $foo = $container->get('foo'); //  $foo = $container['foo']->get(); //  $foo = $container->getService('foo')->get(); 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЫреЛрдЯреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рд╡реИрдз рд╣реИрдВред


рдирд┐рд░реНрднрд░рддрд╛ рд╡рд┐рд╡рд░рдг


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрдм рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд░реНрдЧ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Inversion \ Servise рд╕реЗрд╡рд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдФрд░ рдХрд╛рд░реНрдп рд╣реИрдВред
рдкрд╣рд▓реЗ рд▓реЛрдбрд┐рдВрдЧ рдореЗрдВ рджреЗрд░реА рд╣реЛ рд░рд╣реА рд╣реИред рдЬрдм рддрдХ рдЖрдк рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рддрдм рддрдХ рдХреНрд▓рд╛рд╕ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдЧреАред
рджреВрд╕рд░рд╛, рдЖрдк рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рд░ рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬреЛ рд╡рди рдФрд░ рдЯреВ рдХреНрд▓рд╛рд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:
 namespace My\Space; class One {} class Two {} class Bar { public function __construct(One $one, Two $two) { } } 

рд╣рдо рдЙрд▓рдЯрд╛ рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
 use Inversion\Service; //... $container['one'] = 'My\Space\One'; $container['two'] = 'My\Space\Two'; $container['bar'] = new Service('My\Space\Bar', array($container['one'], $container['two'])); 

рдЕрдм рдЬрдм рдЖрдк рдмрд╛рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ "рдПрдХ" рдФрд░ "рджреЛ" рдХреЗ рдмрдЬрд╛рдп рдЙрдирдХреЗ рд╡рд░реНрдЧ рдирд╛рдореЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ:
 $container['My\Space\One'] = 'My\Space\One'; $container['My\Space\Two'] = 'My\Space\Two'; $container['My\Space\Bar'] = new Service('My\Space\Bar'); // "new Service"   

рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ:
 namespace My\Space; class One implements OneInterface {} class Two implements TwoInterface {} class Bar implements BarInterface { public function __construct(OneInterface $one, TwoInterface $two) { } } 


 $container['My\Space\OneInterface'] = 'My\Space\One'; $container['My\Space\TwoInterface'] = 'My\Space\Two'; $container['My\Space\BarInterface'] = 'My\Space\Bar'; 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:
 $container[] = 'My\Space\One'; $container[] = 'My\Space\Two'; $container[] = 'My\Space\Bar'; 

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


рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрд╡рд╛рдПрдВ


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрдИ рд╕реЗрд╡рд╛рдПрдБ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдк Inversion \ ServiceInterface рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдорд╛рдкрди


рд╡рд░реНрдЧ: рдЙрд▓рдЯрд╛ \ Service \ рдмрдВрдж рдХрд░рдирд╛
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 $container['closure'] = function () use ($container) { return new My\Class(); }; 

рдЖрдк рдирд┐рд░реНрднрд░рддрд╛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 $container['closure'] = function (One $foo, Two $foo) use ($container) { return new My\Class(); }; 

рдЙрд▓рдЯрд╛ \ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдХреЗ рд░реВрдк рдореЗрдВ , рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 $container['closure'] = new Closure(function (One $foo, Two $foo) use ($container) { return new My\Class(); }, array($container['one'], $container['two'])); 


рдлрд╝реИрдХреНрдЯрд░реА


рд╡рд░реНрдЧ: рдЙрд▓рдЯрд╛ \ Service \ Factory
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 $container['factory'] = new Factory('My\ClassFactory', 'create'); 

рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╕реНрддреБ


рд╡рд░реНрдЧ: рдЙрд▓рдЯрд╛ \ Service \ рд╡рд╕реНрддреБ
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 $container['object'] = new My\Class(); 

рдпрд╛
 $container['object'] = new Object(new My\Class()); 


рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк


рд╡рд░реНрдЧ: рдЙрд▓рдЯрд╛ \ Service \ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 $container['prototype'] = new Prototype($object); 

рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдПрдХ рдирдИ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдЧреА: рдХреНрд▓реЛрди $ рд╡рд╕реНрддреБред

рдбреЗрдЯрд╛


рд╡рд░реНрдЧ: рдЙрд▓рдЯрд╛ \ Service \ Data
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 $container['data'] = new Data('what you want'); 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 $container['data'] = array(...); 

рдХреЗ рдмрд░рд╛рдмрд░:
 $container['data'] = new Data(array(...)); 

рд╕реЗрд╡рд╛ рд▓рд┐рдВрдХ


рдЙрд▓рдЯрд╛ рд▓рд┐рдВрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдХреЛ рджреЗрдЦреЗрдВ:
 $container['foo'] = new Service(...); $ref = $container['foo']; //   . 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдХрд┐рд╕реА рднреА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 $container['My\Class\FooInterface'] = new Service('My\Class\Foo'); $container['foo'] = $container['My\Class\FooInterface']; //... $foo = $container('foo'); 

рдЕрдм рдпрджрд┐ рдХреЛрдИ "My \ Class \ FooInterface" рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ "рдлреВ" рдЕрднреА рднреА рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛:
 //... $container['My\Class\FooInterface'] = new Service('Another\FooImpl'); //... $foo = $container('foo'); // $foo instanseof Another\FooImpl 

рдЖрдк рд▓рд┐рдВрдХ рд╕реЗ рд▓рд┐рдВрдХ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 $container['foo'] = 'My\Class\Foo'; $container['ref'] = $container['foo']; $container['ref2'] = $container['ref']; $container['ref3'] = $container['ref2']; //... $foo = $container('ref3'); // $foo instanseof My\Class\Foo $name = $container->getRealName('ref3'); // $name == 'foo' 

рд╕реЗрд╡рд╛ рд╡рд┐рд╕реНрддрд╛рд░


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдХреБрдЫ рд╕реЗрд╡рд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред рд╡рд╣ рдкрд╣рд▓рд╛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдЧрд╛:
 $container['My\Class\FooInterface'] = 'My\Class\Foo'; //... $container['My\Class\FooInterface'] = function (FooInterface $foo) { $foo->extendSome(...); return $foo; }; 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реВрдк рд╣реЛрдЧрд╛, рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 $container['My\Class\FooInterface'] = 'My\Class\Foo'; //... $container->extend('My\Class\FooInterface', function (FooInterface $foo) { return new FooDecorator($foo); }); 

рдкрд░реАрдХреНрд╖рдг


рдЙрд▓рдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯ рдПрдХ рдЕрд▓рдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА ( рдЧреНрд░реИрдиреБрд▓рд╛ / рдЯреЗрд╕реНрдЯ ) рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред

рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рддрд░рд╣


рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рдЙрд▓рдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рддрд░рд╣ рдХрдВрдЯреЗрдирд░ рд░рдЦрдирд╛ рд╢рд╛рдпрдж рд╣реА рдЙрдкрдпреЛрдЧреА рд╣реИ:
 $container = Inversion\Container::getInstanse(); 


рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


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


All Articles