OOP рд╡рд░реНрдХрд╢реЙрдк PHP5: рдПрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдорд┐рд╢реНрд░рдгреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг

рдПрдХ рд╢рд╛рдо, рдЕрдкрдиреЗ рдмрд╛рдЗрдХ рдврд╛рдВрдЪреЗ рдореЗрдВ рдУрдЖрд░рдПрдо рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдЬреЛ рд░реВрдмреА рдореЗрдВ рдорд┐рдХреНрд╕рд┐рди рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рд╕реА # рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ (рдпрд╛ рдкреАрдПрдЪрдкреА рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ / рдЧреНрд░рд╛рдлреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ) рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрд╝реЗрджрд╛рд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рдореИрдВ PHP рдореЗрдВ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрд╢реБрджреНрдзрддрд╛ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдмрддрд╛рдКрдВрдЧрд╛ред



рдореИрдВ рдЖрдкрдХреЛ PHP рдореЗрдВ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдЦ PHP рдХреЗ рд╢реБрд░реБрдЖрддреА рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд╣реИ (рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдУрдУрдкреА рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдиреНрдореБрдЦ рд╣реИрдВ)ред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде PHP 5.3 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЧрд▓рддреА рднреА рдХрд░реВрдВрдЧрд╛, рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреВрдВрдЧрд╛ред рдФрд░ рдЕрдкрдиреА рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рднреА рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдЕрдЪреНрдЫрд╛ рдкрдврд╝рд╛ рд╣реИред







рдЕрд╢реБрджреНрдзрддрд╛ рдХреНрдпрд╛ рд╣реИ?



рдПрдХ рдкреНрд░рд╡реЗрд╢ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдмрд╕ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдФрд░ рдЧреБрдгреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдорд┐рд▓рд╛рдирд╛, рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬрд┐рд╕реЗ PHP рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП PHP рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╕рдорд╛рди рдЫрджреНрдо рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ:

 <? php
 рдорд┐рдХреНрд╕ рдЯрд╛рдЗрдорд┐рдмрд▓ {
     рдирд┐рдЬреА $ timeStarted;
     рдирд┐рдЬреА $ рд╕рдордп;
     рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рд╢реБрд░реВ () {$ timeStarted = time ();  }
     рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рд░реЛрдХ () {$ timeStnect = time ();  }
     рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ getElapsed () {$ $ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ - $ timeStarted}
 }

 рдорд┐рдХреНрд╕ рдбрдВрдкреЗрдмрд▓ {
     рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рдбрдВрдк () {var_dump ($ рдпрд╣);  }
 }

 рд╡рд░реНрдЧ MyClass рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдпреЛрдЧреНрдп, Dumpable {
     рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рд╣реИрд▓реЛ () {}
 }

 $ a = рдирдпрд╛ MyClass ();
 $ a-> рдкреНрд░рд╛рд░рдВрдн ();
 рдиреАрдВрдж (250);
 $ a-> рд╕реНрдЯреЙрдк ();
 рдЗрдХреЛ $ a-> getElapsed ();
 $ a-> рдбрдВрдк ();
 ?>




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

рдЪрд▓реЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред





рд╣рдо рдПрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдбрд┐рдЬрд╛рдЗрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред



рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рд╕реЛрдЪрддреЗ рд╣реИрдВред рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдХрд╣реАрдВ рди рдХрд╣реАрдВ, рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЬрдорд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрддреА рд╣реИрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдХреЛ рдЪреБрдирд╛ (PHP рдореЗрдВ рд╕реНрдерд┐рд░ рдХрдХреНрд╖рд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ C # рдореЗрдВ рд╣реИрдВред рдПрдХ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдЧреАред рд╡рд░реНрдЧ)ред рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ (рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ; рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж) рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред



рдКрдкрд░ рд╕реЗ рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ, рд╣рдордиреЗ рдХрд╣рд╛ рдХрд┐ рдпрджрд┐ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╢реБрджреНрдзрддрд╛ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдЕрд╢реБрджреНрдзрддрд╛ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рднреА рд╡рдВрд╢ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд╕рдордп рдкреВрд░реНрд╡рдЬреЛрдВ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рдореЗрдВ рд▓реЛрдбрд┐рдВрдЧ рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)ред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреА рд╕реВрдЪреА (рд╡рд░реНрдЧ => рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА) рд╣рдо рдмрд╛рдж рдореЗрдВ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреА рд╕реВрдЪреА рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рди рдХрд┐рдпрд╛ рдЬрд╛рдПред



class Registry { private static $registeredMixins = array(); public static function register($className, $mixinClassName) { $mixinClassNames = func_get_args(); unset($mixinClassNames[0]); foreach ($mixinClassNames as $mixinClassName) { self::$registeredMixins[$className][] = $mixinClassName; } self::$classNameToMixinCache = array(); } }
      
      





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



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

рдХреИрд╢рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдкреВрд░реНрд╡рдЬреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:

  private static $classNameToMixinCache = array(); private static function getAncestors($className) { $classes = array($className); while (($className = get_parent_class($className)) !== false) { $classes[] = $className; } return $classes; } private static function precacheMixinListForClass($className) { if (isset(self::$classNameToMixinCache[$className])) { return; } $ancestors = self::getAncestors($className); $result = array(); foreach ($ancestors as $ancestor) { if (isset(self::$registeredMixins[$ancestor])) { $result = array_merge($result, self::$registeredMixins[$ancestor]); } } self::$classNameToMixinCache[$className] = array_unique($result); }
      
      







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



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

  public static function getMixinsFor($className) { self::precacheMixinListForClass($className); return self::$classNameToMixinCache[$className]; }
      
      





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

рдЪреВрдВрдХрд┐ рдкреНрд░рд╡реЗрд╢ рдХрдХреНрд╖рд╛ рдХрд╛ рд╕рд╛рд░ рд╣реИ, рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ:



  private static $methodLookupCache = array(); public static function getMixinNameByMethodName($className, $methodName) { if (isset(self::$methodLookupCache[$className][$methodName])) { return self::$methodLookupCache[$className][$methodName]; } self::precacheMixinListForClass($className); foreach (self::$classNameToMixinCache[$className] as $mixin) { if (method_exists($mixin, $methodName)) { self::$methodLookupCache[$className][$methodName] = $mixin; return $mixin; } } throw new MemberNotFoundException("$className has no mixed method $methodName()!"); }
      
      







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

рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦреЗрдВред

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



рд╣рдо рдПрдХ рдкреНрд░рд╡реЗрд╢ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВред



рддреЛ, рдПрдХ рдкреНрд░рд╢рдВрд╕рд╛ред рдХреНрдпрд╛ рдЕрд╢реБрджреНрдзрддрд╛? рдкреНрд░рд╡реЗрд╢ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд╣реИред рд╡рд╣ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрдиреНрдп рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред

 class Base { protected $_owningClassInstance; protected $_owningClassName; public function __construct($owningClassInstance) { $this->_owningClassInstance = $owningClassInstance; $this->_owningClassName = get_class($owningClassInstance); } }
      
      







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



рд╣рдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЫрд┐рдкреЗ рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рджреЗрддрд╛ рд╣реВрдВ:

  protected $_owningPropertyReflectionCache; protected $_owningMethodReflectionCache; protected function getProtected($name) { if (! isset($this->_owningPropertyReflectionCache[$name])) { $property = new \ReflectionProperty($this->_owningClassName, $name); $property->setAccessible(true); $this->_owningPropertyReflectionCache[$name] = $property; } return $this->_owningPropertyReflectionCache[$name]->getValue($this->_owningClassInstance); } protected function setProtected($name, $value) { if (! isset($this->_owningPropertyReflectionCache[$name])) { $property = new \ReflectionProperty($this->_owningClassName, $name); $property->setAccessible(true); $this->_owningPropertyReflectionCache[$name] = $property; } $this->_owningPropertyReflectionCache[$name]->setValue($this->_owningClassInstance, $value); } protected function invokeProtected($name, $parameters) { $method = new \ReflectionMethod($this->_owningClassName, $name); $method->setAccessible(true); $parameters = func_get_args(); unset($parameters[0]); $method->invokeArgs($this->_owningClassInstance, $parameters); }
      
      







рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдХреИрд╢рд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдХреИрд╢рд┐рдВрдЧ рдХреЛ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ method_exists () рдФрд░ property_exists () рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╣рдордиреЗ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдереЗ, рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдирд╛рдо рдХреЗ рд╕рд╛рде рдЫрд┐рдкреЗ рд╣реБрдП рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рд╡рд░реНрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕реА рдирд╛рдо рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ "рдкреНрд░рдпрд╛рд╕" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ рдЫрд┐рдкреЗ рдпрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:



  public function __call($name, array $arguments) { throw new MemberNotFoundException( "Method $name is not defined or is not accessible in mixin \"" . get_class() . "\""); } public function __get($name) { throw new MemberNotFoundException( "Property $name is not defined or is not accessible in mixin \"" . get_class() . "\""); } public function __set($name, $value) { throw new MemberNotFoundException( "Property $name is not defined or is not accessible in mixin \"" . get_class() . "\""); }
      
      







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



рдЙрдоред рд╡рд╣ рд╕рдм рд╣реИред рдорд┐рд╢реНрд░рдг рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдЕрдВрддрд┐рдо рдЪрд░рдг рдмрдирд╛ рд╣реБрдЖ рд╣реИ - рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рдорд┐рд╢реНрд░рдг рдХреЗ рд▓рд┐рдП рдордВрдЪ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХрдХреНрд╖рд╛рдПрдВред рдЕрдм рд╣рдо рдпрд╣реА рдХрд░реЗрдВрдЧреЗред



рд╣рдо рдПрдХ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВред



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



 class Aggregator { protected $_mixins; protected $_className; public function __construct($aggregatorClassInstance = false) { $this->_className = $aggregatorClassInstance ? get_class($aggregatorClassInstance) : get_class($this); $mixinNames = Registry::getMixinsFor($this->_className); foreach ($mixinNames as $mixinName) { $this->_mixins[$mixinName] = new $mixinName($aggregatorClassInstance ? $aggregatorClassInstance : $this); } } }
      
      







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

рдЪрд░ $ рдПрдЧреНрд░реАрдЧреЗрдЯрд░рдХреНрд▓рд╛рд╕ рдЗрдирд╕реНрдЯреЗрдВрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХреНрд▓рд╛рд╕ рд╕реЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рд▓реЗрдиреА рд╣реИред рд╣рдо рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рджреВрд╕рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рджреВрд╕рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд░рд╛рдмрд░ $ рдПрдЧреНрд░реАрдЧреЗрдЯрд░рдХреНрд▓рд╛рд╕ рдЗрдирд╕реНрдЯреЗрдВрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдРрд╕рд╛ рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рдЗрд╕ рд╕реНрд╡рд╛рдореА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рд╡рд░реНрдЧ рдХреА рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред



рдпрджрд┐ рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЖрдкрдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ - рддреЛ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред рдереЛрдбрд╝рд╛ рдХрдо рд╕рд░рдХрдирд╛, рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рджреЗрдЦреЗрдВ рдХрд┐ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдЙрджрд╛рд╣рд░рдг рд╕рдВрд░рдЪрдирд╛ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред



рд╣рдореЗрдВ "рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЛрдВ" рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реИред



  public function __call($name, array $arguments) { return call_user_func_array(array($this->_mixins[Registry::getMixinNameByMethodName($this->_className, $name)], $name), $arguments); } public function __get($name) { return $this->_mixins[Registry::getMixinNameByPropertyName($this->_className, $name)]->$name; } public function __set($name, $value) { $this->_mixins[Registry::getMixinNameByPropertyName($this->_className, $name)]->$name = $value; } public function __isset($name) { return isset($this->_mixins[Registry::getMixinNameByPropertyName($this->_className, $name)]->$name); }
      
      







рдкреНрд░рддреНрдпреЗрдХ рдореИрдЬрд┐рдХ рдореЗрдердб рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред



рдЕрдкрд╡рд╛рдж рд╡рд░реНрдЧ рдЬрд┐рд╕рдХрд╛ рд╣рдордиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╡рд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:



 class MemberNotFoundException extends \Exception {}
      
      







рдЖрдЗрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред





рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдкрд╛рд░рдВрдкрд░рд┐рдХ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА:



 class MixinAggregatorSample extends Mixins\Aggregator { } class MixinHello extends Mixins\Base { protected $inaccessible; public $text = "I am a text!\r\n"; public function hello() { echo ("Hello from mixin!\r\n"); } } Mixins\Registry::register("MixinAggregatorSample", "MixinHello"); $a = new MixinAggregatorSample(); $a->hello(); //Accesing mixed methid echo ($a->text); //Accessing mixed property $a->text = "I am also a text!\r\n"; //Setting mixed property //$a->inaccessible = 'Error here'; //Throws exception //$a->inaccessible2 = 'Error here'; //Throws yet another exception (Homework: explain, why) echo ($a->text); var_dump(isset($a->text));
      
      







рдЕрдм рд╕рдорд╛рд╡реЗрд╢ рд╕рд░реНрдХрд┐рдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:



 class MixinAggregatorSample { protected $_aggregator; public function __construct() { $this->_aggregator = new Mixins\Aggregator($this); } public function __call($name, $arguments) { return $this->_aggregator->__call($name, $arguments); } } class MixinHello extends Mixins\Base { public function hello() { echo ("Hellp from mixin!"); } } Mixins\Registry::register("MixinAggregatorSample", "MixinHello"); $a = new MixinAggregatorSample(); $a->hello();
      
      







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



рдЧрддрд┐





рдореИрдВрдиреЗ рдкрд░рд┐рдгрд╛рдореА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЧрддрд┐ рдХреЗ рдХреБрдЫ рдорд╛рдк рдХрд┐рдПред рдорд╛рдк рдмрд╣реБрдд рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВ, рдПрдХ рдЦреБрд▓реЗ рдЖрдИрдбреАрдИ, Winamp рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдШрд░реЗрд▓реВ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ



 рд╕рдордп рдореВрд▓: 0.57831501960754
 рд╕рдордп рдХреЗ рдЕрдиреБрд╕рд╛рд░: 1.5227220058441
 рд╕рдордп рдорд┐рд╢реНрд░рд┐рдд: 7.5425450801849
 рд╕рдордп рдкреНрд░рддрд┐рдмрд┐рдВрдм: 12.221807956696








рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЖрдВрдХрдбрд╝реЗ рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рд╕реА рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрд╢реБрджреНрдзрддрд╛ рддрд░реАрдХреЛрдВ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ рдмрд╛рд░ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 10 microseconds рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 0.7 microseconds рдореВрд▓ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ HTMLspecialchars () рдкрд░ рдмрд┐рддрд╛рдпрд╛ рдЧрдпрд╛ рд╕рдордп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкрд╛рда рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╡реЗрд░реА рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред



рдЪреВрдБрдХрд┐ рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рд╣рдо рд╣реИрд╢рд┐рдВрдЧ PHP рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдФрд░ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рд╡рд░реНрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдмрд╣реБрдд рдЧрд┐рд░рд╛рд╡рдЯ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред



рдЙрдкрд╕рдВрд╣рд╛рд░



рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрдкрдХреА рдЖрд▓реЛрдЪрдирд╛ рд╕реБрдирдХрд░ рдореБрдЭреЗ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реБрдИред рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред



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



рдпрджрд┐ PHP рдореЗрдВ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╖рдп рдЖрдкрдХреА рд░реБрдЪрд┐ рд╣реИ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рднреА Googleред



All Articles