AOP рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП PHP 5.4 рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

PHP рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдирдореЗрдВ рд╕реЗ рдореБрдЭреЗ рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХреЗ рдФрд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реМрдВрджрд░реНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХреЗред

PHP рдореЗрдВ AOP рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреАрдЬ


рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЗ

рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрд╛рдп рд╣реИ __call рдФрд░ __callStatic " рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЛрдВ " рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЧреИрд░-рдореМрдЬреВрдж рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ (рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рдФрд░ рдЗрд╕рдХреЗ рдкрд╛рд╕ рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрд╡реЗрджрди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реАрдХреЛрдВ рдореЗрдВ рдПрдХ рдирд╛рдо рд╣реИ рдЬреЛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдХреНрд░реЙрд╕-рдлрдВрдХреНрд╢рдирд▓ "рдореИрдЬрд┐рдХ рдореЗрдердбреНрд╕" рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░ рджреЗрддрд╛ рд╣реИред

рдкреЗрд╢реЗрд╡рд░реЛрдВ:

рд╡рд┐рдкрдХреНрд╖:

рдХреЛрдб рдкрд╛рд░реНрд╕рд┐рдВрдЧ

рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдПрдХ рдордзреНрдпрд╕реНрде рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ "рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░" рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╣рд╛рдпрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ (xml / json рд╡рд┐рдиреНрдпрд╛рд╕, рдЕрддрд┐рд░рд┐рдХреНрдд php рд╡рд░реНрдЧреЛрдВ рдпрд╛ рдХреЛрдб рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди) рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдордзреНрдпрд╕реНрде рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡реЗрд╖рдг рд╣реЛрддреЗ рд╣реИрдВред

рдкреЗрд╢реЗрд╡рд░реЛрдВ:

рд╡рд┐рдкрдХреНрд╖:

рд░рди рдЯрд╛рдЗрдо рдкрд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛

рдХреБрдЦреНрдпрд╛рдд рд░рдирдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬреЛ рдЖрдкрдХреЛ рдХрд╛рд░реНрдп рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдорд┐рд▓реЛ: рдПрдиреЛрдЯреЗрдЯрд░ ред

рдПрдиреЛрдЯреЗрдЯрд░ рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рдкреБрд╕реНрддрдХрд╛рд▓рдп 4 рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВрдбрд▓рд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

рдЬрд╛рдирдХрд╛рд░реА

рдПрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрд╛рд░ рд╣реИрдВрдбрд▓рд░ рдХрдХреНрд╖рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╡рд┐рдзрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ "рд░рдЬрд┐рд╕реНрдЯрд░" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ URL рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд░реВрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реЗ рдкрд╣рд▓реЗ

рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреЗ рдмрд╛рдж

рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЖрдлреНрдЯрд░ рдореЗрдердб рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЪрд╛рд░реЛрдВ рдУрд░

рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдЪрд╛рд░реЛрдВ рдУрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рд╕реНрдерд╛рдкрдирд╛


рдПрдиреЛрдЯреЗрдЯрд░ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PHP 5.4 рдФрд░ рд░рдирдХрд┐рдЯ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

  1. рдпрд╣рд╛рдВ рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ: https://github.com/zenovich/runkit ;
  2. рд╣рдо рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
    phpize && ./configure && make && sudo make install 
  3. рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ рд╣рдо run.d.so рдореЙрдбреНрдпреВрд▓ рдХреЛ conf.d рдпрд╛ php.ini рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ;
  4. Annotator.php рд╡рд░реНрдЧ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред

рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг


рдХрдХреНрд╖рд╛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рд▓рд┐рдП 4 рдкреВрд░реНрд╡-рдЖрд░рдХреНрд╖рд┐рдд рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬрдмрдХрд┐ рдХрд┐рд╕реА рднреА 4 рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдЬрд╛рдирдХрд╛рд░реА

 <?php require_once __DIR__ . '/Annotator.php'; class Advice { public static function infoStatic($point, $options) { var_dump($point); var_dump($options); } } class Test { /** * @info Advice::infoStatic hello world */ public static function testInfoStatic() { return 'info'; } } Annotator::compile('Test'); 

рдХреЙрд▓ рдПрдиреЛрдЯреЗрдЯрд░ рдХреЗ рджреМрд░рд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА :: рд╕рдВрдХрд▓рди ('рдЯреЗрд╕реНрдЯ'); рдПрдбрд╡рд╛рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЗрдВрдлреЛрд╕реНрдЯреИрдЯрд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХрд╣рд▓рд╛рдПрдЧрд╛, рдЬреЛ рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рдЯреЗрд╕реНрдЯрдЗрдиреНрдлреЛрд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдердб рдФрд░ рд╣реИрдВрдбрд▓рд░ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрд░реЗ рд╕рд░рдгреА ('рд╣реИрд▓реЛ', 'рджреБрдирд┐рдпрд╛') рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред

рд╕реЗ рдкрд╣рд▓реЗ

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдорд╛рдирдХ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рд╕реНрдереИрддрд┐рдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

 <?php require_once __DIR__ . '/Annotator.php'; class Advice { public function before($point, $params, $options) { $params['string'] = 'bar'; } } class Test { /** * @registered_before */ public function testBefore($string) { return $string; } } $advice = new Advice(); Annotator::register('registered_before', array($advice, 'before'), Annotator::BEFORE); Annotator::compile('Test'); $test = new Test(); echo $test->testBefore('foo'); 

рдПрдиреЛрдЯреЗрдЯрд░ :: рд░рдЬрд┐рд╕реНрдЯрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ $ рд╕рд▓рд╛рд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд╣рд▓реЗ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ @registered_before рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдпрд╛ред рдЬрдм рдЯреЗрд╕реНрдЯрдмрд┐рдпрд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рд╣реИрдВрдбрд▓рд░ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ $ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдкреЗрдХреНрд╖рд┐рдд "рдлреВ" рдХреЗ рдмрдЬрд╛рдп "рдмрд╛рд░" рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред

рдХреЗ рдмрд╛рдж

 <?php require_once __DIR__ . '/Annotator.php'; class Advice { public function power($point, $params, $options, $result) { return pow($result, $options[0]); } } class Test { /** * @power 4 */ public function testAfter($number) { return $number + 1; } } $advice = new Advice(); Annotator::register('power', array($advice, 'power'), Annotator::AFTER); Annotator::compile('Test'); $test = new Test(); echo $test->testAfter(1); 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, TestAfter рд╡рд┐рдзрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ 4. рдХреА рд╢рдХреНрддрд┐ рддрдХ рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛рди 16 рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред

рдЪрд╛рд░реЛрдВ рдУрд░

 <?php require_once __DIR__ . '/Annotator.php'; class Advice { private static $cache = array(); public function cache($point, $params, $options, $proceed) { if (array_key_exists($options[0], self::$cache)) { //       -   return self::$cache[$options[0]]; } else { //      -   $result = $proceed(); //          self::$cache[$options[0]] = $result; return $result; } } } class Test { /** * @cache around_cache_key */ public function testAround($string) { return $string; } } $advice = new Advice(); Annotator::register('cache', array($advice, 'cache'), Annotator::AROUND); Annotator::compile('Test'); $test = new Test(); echo $test->testAround('foo') . PHP_EOL; echo $test->testAround('foo') . PHP_EOL; echo $test->testAround('foo') . PHP_EOL; 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреИрд╢рд┐рдВрдЧ рддрдВрддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред TestAround рд╡рд┐рдзрд┐ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ 3 рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ 1 рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд╛рдХреА 2 рдЧреБрдирд╛ рдореВрд▓реНрдп рдПрдбрд╡рд╛рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рдЪрд░ $ рдХреИрд╢ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдкрд╣рд▓реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдмрдЪрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдПрдХрд╛рдзрд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдПрдиреЛрдЯреЗрдЯрд░ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рд╕рд╣рд┐рдд рдХрдИ рд╣реИрдВрдбрд▓рд░ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 <?php require_once __DIR__ . '/Annotator.php'; class Advice { public static function before1($point, $params, $options) { $params['string'] .= 'before1'; } public static function before2($point, $params, $options) { $params['string'] .= ' before1'; } public static function after1($point, $params, $options, $result) { return $result . ' after1'; } public static function after2($point, $params, $options, $result) { return $result .= ' after2'; } public static function around1($point, $params, $options, $proceed) { return $proceed() . ' around1'; } public static function around2($point, $params, $options, $proceed) { return $proceed() . ' around2'; } } class Test { /** * @before Advice::before1 * @after Advice::after1 * @around Advice::around1 * @before Advice::before2 * @after Advice::after2 * @around Advice::around2 */ public function testMulti($string) { return $string; } } Annotator::compile('Test'); $test = new Test(); echo $test->testMulti(''); 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд▓рд╛рдЗрди "рдкрд╣рд▓реЗ 1 рд╕реЗ рдкрд╣рд▓реЗ рд▓рдЧрднрдЧ 1 рд▓рдЧрднрдЧ 2 рдХреЗ рдЖрд╕рдкрд╛рд╕ рд▓рдЧрднрдЧ 1 рдмрд╛рдж 1 рдХреЗ рдмрд╛рдж 2" рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧреАред

рд╕рдВрдЪрд╛рд▓рдХреЛрдВ


рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдкрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ:

рдЬрд╛рдирдХрд╛рд░реА


рд╕реЗ рдкрд╣рд▓реЗ


рдХреЗ рдмрд╛рдж


рдЪрд╛рд░реЛрдВ рдУрд░

рдЕрдВрддрднрд╛рд╖рдг


рдПрдиреЛрдЯреЗрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрд╡реЗрджрди рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рд╕рд░рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдПрдУрдкреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рддрд░реАрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдиреЛрдЯреЗрдЯрд░ :: рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ php рдХрдХреНрд╖рд╛рдПрдВ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИ ред

рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП (рд╕рд░рд▓ рдбреЗрдореЙрди рдпрд╛ phpDaemon- рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ ), рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдУрд╡рд░рд╣реЗрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдХреЗрд╡рд▓ 1 рдмрд╛рд░ рд▓реЛрдб рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреАред

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


All Articles