рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдмрд╛рдЗрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдореИрдВ рдЖрдкрдХреЗ рдмрдЧрд▓ рдореЗрдВ рднреА рдмреИрда рд╕рдХрддрд╛ рд╣реВрдБ? рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реА рдмрд╛рдЗрдХ рдЦрд╛рд╕ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рджрд┐рди рдореЗрдВ рд╕рд░рд▓, рддреАрди-рдкрд╣рд┐рдпрд╛, riveted рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдЪрд╛рд▓ рд╣реИ - рдпрд╣ рдПрдХ рдХрд╛рд░ рд╕реЗ рдЗрдВрдЬрди рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдФрд░ рджреЗрдЦреЛ:
<?php $class = MySingleton::getInstance(); var_dump($class instanceof MySingleton);
рдЕрд░реЗ рдирд╣реАрдВ, рд╣рдордиреЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ! рд╣рдордиреЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ред рдЕрдм рдХреИрд╕реЗ рд░рд╣реЗрдВ?
рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ рдЕрдм рдЕрд▓рдЧ рд╣реИ: рд╣рдо рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреИрд╕реЗ рд░рд╣рддреЗ рдереЗ?
рдорд┐рд▓рд┐рдП
AspectMock рд╕реЗ ред PHP рдореЗрдВ рдореЙрдм рдФрд░ рд╕реНрдЯрдмреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдлреНрд░реЗрдорд╡рд░реНрдХред
рдЖрдкрдХрд╛ рдирдпрд╛ рд╕реБрдкрд░ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рд╕рд╣рд╛рдпрдХред
рдирд╛рдЗрдЯ рдПрдЧрд░ рд╕реЗ
рдЧреЛ рдПрдУрдкреА рдкрд░ рдЖрдзрд╛рд░рд┐рддред
рддреЛ, рдПрд╕реНрдкреЗрдХреНрдЯрдореЙрдХ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдкрд░реАрдХреНрд╖рдг рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдХреЗ рдХрд╛рд░рдг PHP рдореЗрдВ "рдмреБрд░реА рдкреНрд░рдерд╛рдУрдВ" рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред рд╕реНрдЯреЗрдЯрд┐рдХ рддрд░реАрдХреЗ, рд╕рд┐рдВрдЧрд▓рдЯрди, рдХреНрд▓рд╛рд╕ рдореЗрдердбреНрд╕ - рдпрд╣ рд╕рдм рдЕрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХреА рдХреЙрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
<?php class UserService { function createUserByName($name) { $user = new User; $user->setName($name); $user->save(); } } ?>
рдХрд╛рд╢, рд╣рдо рд╢рд╛рд╕реНрддреНрд░реАрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╣рдо рдЬреЛ рднреА рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдмрдЪрд╛рдиреЗ () рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, AspectMock рдореЗрдВ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
<?php function testUserCreate() { $user = test::double('User', ['save' => null])); $service = new UserService; $service->createUserByName('davert'); $this->assertEquals('davert', $user->getName()); $user->verifyInvoked('save'); } ?>
рд╕реЗрд╡ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдбрдореА рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдо рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рдЖрдзрд╛рд░ рдмрд░рдХрд░рд╛рд░ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред 100% рдХрд╡рд░реЗрдЬ, рдЗрдиреНрд╕реБрд▓реЗрд╢рди рдореМрдЬреВрдж рд╣реИред
рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рд╣реИ?
PHP рдореЗрдВ, рдХрд┐рд╕реА рднреА рдЕрдпреЛрдЧреНрдп рдХреЛрдб рдХреЛ рдмреБрд░рд╛ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЬреАрдм рдкреНрд░рдерд╛ рдмрди рдЧрдИ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ ActiveRecord рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдмрд╕реЗ рдЕрд╕реНрдерд┐рд░ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╡рд╣ рдмреБрд░рд╛ рд╣реИ? рдЦреИрд░, рдЖрдЦрд┐рд░ рдЭреВрдаред рдЕрдЪреНрдЫрд╛ рдкреИрдЯрд░реНрди, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдиреМрдХрд╛рдУрдВ рдкрд░ рдХрдИ рдУрдЖрд░рдПрдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдпрд╣ рдкреНрд░рдерд╛ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдХреЛрдб рдХреА "рдкрд░реАрдХреНрд╖рдгрд╢реАрд▓рддрд╛" рдХреЗрд╡рд▓ PHP рднрд╛рд╖рд╛ рдХреА рддрдХрдиреАрдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рддреБрд░рдВрдд рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдФрд░ рдЕрдм рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ PHP рдореЗрдВ рд▓рдЧрднрдЧ рдХреЛрдИ рднреА OOP рдХреЛрдб рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рджреЗрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ, рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ PHPUnit рдореЗрдВ рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдЙрди рдкрд░ рдореЛрдХреА рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдФрд░ рдЗрд╕рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ?
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд░рд▓рддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рд╡реЗ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
AspectMock рдЖрдкрдХреЛ рдХреБрд╢рд▓ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рд╕рд╣реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рд╕рд╣реА рдорд╛рдирдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдкрдХреЛ PHP рдХреА рддрдХрдиреАрдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЕрджреНрднреБрдд рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдХрд╣рд╛:
тАЬрдХреБрдЫ рднреА рд╕рдЪ рдирд╣реАрдВ рд╣реИред рд╕рдм рдХреБрдЫ рдЕрдиреБрдордд рд╣реИред тАЭрдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
AspectMock рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдХреЗрд╡рд▓ 8 рдлрд╛рдЗрд▓реЗрдВред рд╡рд╣рд╛рдБ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЧреЛ рдПрдУрдкреА,
рдЬрд┐рд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдмреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рдереЗ , рдкреЙрдЗрдВрдЯрдХрдЯреЛрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рднреА рдЖрд╡реЗрджрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдордВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдбрдореА рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧреЛ AOP рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдкреНрд░реЙрдХреНрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдСрдЯреЛ-рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдмрджрд▓рдХрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд:
рд╕рд┐рдореНрдлрдиреА 2 ,
рдЬрд╝реЗрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ 2 ,
рд╡рд╛рдИрдЖрдИрдЖрдИ ,
рд▓рд╛рд░рд╡реЗрд▓ ред рдпрджрд┐ рдЖрдк рдЧреЛ рдПрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ
рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдПрд╕реНрдкреЗрдХреНрдЯрдореЙрдХ рдХрд╣рд╛рдБ рд▓рд╛рдЧреВ рдХрд░реЗрдВ?
рдЦреИрд░, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд╣реАрдВ рд╣реИред AspectMock рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдФрд░
PHPUnit рдФрд░
рдХреЛрдбрдкреНрд╢рди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред AspectMock рдХрд┐рддрдирд╛ рд╕реНрдерд┐рд░ рд╣реИ? рдмрд┐рд▓реНрдХреБрд▓ рдЧреЛ AOP рдХреЗ рд╕рдорд╛рди рд╣реАред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрднреА рднреА рдмрд╣реБрдд рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИред рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг 0.1.0 рд╣реИред рд╕рдмрд╕реЗ рдХрдард┐рди рдмрд╛рдд рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд╛рдкрдирд╛ рд╣реИред рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ, рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдЖрдкрдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рд╣реБрдЖ, рддреЛ рдЗрд╕реЗ рдЖрдзрд╛ рдХрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧреАред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдПрд╕реНрдкреЗрдХреНрдЯрдореЙрдХ рдЬреАрдердм рдкрд░ рд░рд╣рддрд╛ рд╣реИрдЕрдкрдбреЗрдЯ: рдПрдХ рд╡реАрдбрд┐рдпреЛ рдПрдХреНрд╢рди рдореЗрдВ рджрд┐рдЦрд╛ рд░рд╣рд╛ рдерд╛рдПрдХ рдмрд╛рд░ рджреЗрдЦ рд▓реЗрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рдХрдИ рдмрд╛рд░ рдкрдврд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрд╛рд░ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред