рдЙрд▓рдЯрд╛ PHP 5.3 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрдВрдЯреЗрдирд░ рд╣реИред рд╕реЗрд╡рд╛ рдЙрдиреНрдореБрдЦ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рд▓рд┐рдВрдХ, PRS-0, рдФрд░
рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдЖрдк packagist.org:
granula / inversion рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ PRS-0 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЧрдд рдмреВрдЯрд▓реЛрдбрд░
рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЬреЛрдбрд╝рдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
$container = new Inversion\Container(); $container['foo'] = 'My\Class\Foo';
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдо рдХрдВрдЯреЗрдирд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдореЗрдВ, рд╣рдо "рдлреВ" рдФрд░ рд╕реЗрд╡рд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЬреБрдбрд╝рд╛рд╡ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ "рдорд╛рдп \ рдХреНрд▓рд╛рд╕ \ рдлреВ" рд╢реНрд░реЗрдгреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕ рддрд░рд╣ рдФрд░ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
$container->addService(new Service('My\Class\Foo'), 'foo');
"рдлреВ" рдирд╛рдо рджреВрд╕рд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдиреАрдЪреЗред
рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдореЗрдВ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдФрд░ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
$foo = $container('foo');
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЫреЛрдЯреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рд╡реИрдз рд╣реИрдВред
рдирд┐рд░реНрднрд░рддрд╛ рд╡рд┐рд╡рд░рдг
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрдм рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд░реНрдЧ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Inversion \ Servise рд╕реЗрд╡рд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдФрд░ рдХрд╛рд░реНрдп рд╣реИрдВред
рдкрд╣рд▓реЗ рд▓реЛрдбрд┐рдВрдЧ рдореЗрдВ рджреЗрд░реА рд╣реЛ рд░рд╣реА рд╣реИред рдЬрдм рддрдХ рдЖрдк рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рддрдм рддрдХ рдХреНрд▓рд╛рд╕ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдЧреАред
рджреВрд╕рд░рд╛, рдЖрдк рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рд░ рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬреЛ рд╡рди рдФрд░ рдЯреВ рдХреНрд▓рд╛рд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:
namespace My\Space; class One {} class Two {} class Bar { public function __construct(One $one, Two $two) { } }
рд╣рдо рдЙрд▓рдЯрд╛ рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
use Inversion\Service;
рдЕрдм рдЬрдм рдЖрдк рдмрд╛рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ "рдПрдХ" рдФрд░ "рджреЛ" рдХреЗ рдмрдЬрд╛рдп рдЙрдирдХреЗ рд╡рд░реНрдЧ рдирд╛рдореЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ:
$container['My\Space\One'] = 'My\Space\One'; $container['My\Space\Two'] = 'My\Space\Two'; $container['My\Space\Bar'] = new Service('My\Space\Bar');
рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ:
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'];
рдЕрдм рдпрджрд┐ рдХреЛрдИ "My \ Class \ FooInterface" рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ "рдлреВ" рдЕрднреА рднреА рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛:
рдЖрдк рд▓рд┐рдВрдХ рд╕реЗ рд▓рд┐рдВрдХ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
$container['foo'] = 'My\Class\Foo'; $container['ref'] = $container['foo']; $container['ref2'] = $container['ref']; $container['ref3'] = $container['ref2'];
рд╕реЗрд╡рд╛ рд╡рд┐рд╕реНрддрд╛рд░
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдХреБрдЫ рд╕реЗрд╡рд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред рд╡рд╣ рдкрд╣рд▓рд╛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдЧрд╛:
$container['My\Class\FooInterface'] = 'My\Class\Foo';
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реВрдк рд╣реЛрдЧрд╛, рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
$container['My\Class\FooInterface'] = 'My\Class\Foo';
рдкрд░реАрдХреНрд╖рдг
рдЙрд▓рдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯ рдПрдХ рдЕрд▓рдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (
рдЧреНрд░реИрдиреБрд▓рд╛ / рдЯреЗрд╕реНрдЯ ) рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред
рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рддрд░рд╣
рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рдЙрд▓рдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рддрд░рд╣ рдХрдВрдЯреЗрдирд░ рд░рдЦрдирд╛ рд╢рд╛рдпрдж рд╣реА рдЙрдкрдпреЛрдЧреА рд╣реИ:
$container = Inversion\Container::getInstanse();
рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- рд╕рд┐рдореНрдлрдиреА рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рднрд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдЕрдЪреНрдЫрд╛ рдкреНрд░рд▓реЗрдЦрди рд╣реИред
- рджрд╛рдирд╛ рд╕рд┐рдореНрдлрдиреА рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдПрдХ рд╕рд░рд▓ рдФрд░ рдмрд╣реБрдд рд╣рд▓реНрдХрд╛ (рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рд╛рдЗрд▓) "рдХрдВрдЯреЗрдирд░" рд╣реИред