рдЕрдВрддрд┐рдо рдХреЗ рд╕рд╛рде рд╡рд┐рд░рд╛рд╕рдд рдХреА рд╕реАрдорд╛ рдХреНрдпреЛрдВ?

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


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


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


рдирд╛рдЬреБрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреА рд╕рдорд╕реНрдпрд╛


рдирд╛рдЬреБрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреА рд╕рдорд╕реНрдпрд╛


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


рдХрдордЬреЛрд░ рд╕рдЧрд╛рдИ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВред


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

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


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


рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдордЬрдмреВрдд рд╕рдВрдмрдВрдз


рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдордЬрдмреВрдд рд╕рдВрдмрдВрдз


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


рд╡рдВрд╢рд╛рдиреБрдЧрдд рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╡рд░реНрдЧ рд▓рд┐рдВрдХреЗрдЬ рдХреА рдХрдореА рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЧреБрдВрдЬрд╛рдЗрд╢ ( private , protected ) рдХреЗ рдкреНрд░рддрд┐рдмрдВрдзрдХ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ рд░рд╛рдп рдпрд╣ рднреА рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ private рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ protected рд╕рдВрд╢реЛрдзрдХ рдХреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдФрд░ рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред


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


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


 class CommentBlock { /** @var Comment[]   */ private $comments = []; } 

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


рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдореБрджреНрджреЗ


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


рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЫреБрдкрд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ


рдЪреВрдВрдХрд┐ рдЙрдкрд╡рд░реНрдЧ рдореЗрдВ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо encapsulation рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред

GoF, рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди

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


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


  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  • рд╕рднреА рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ред

рдпрд╛рдиреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╛рд▓ рд╡рд░реНрдЧ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдкрдиреЗ protected рдЧреБрдгреЛрдВ рдореЗрдВ рдЫрд┐рдкреЗ рдореВрд▓ рд╡рд░реНрдЧ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред


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


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


рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЛ рдЕрдм рди рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ , рдмрд▓реНрдХрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рднреА рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХрд╛рдо рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдБ рдЖрдПрдВрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, protected рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд╛рд╣рд░реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рддред рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЗрд╡рд▓ public рдФрд░ private рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


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


рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдПрдХ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫреБрдкрд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди


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


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо CommentBlock рд╡рд░реНрдЧ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ CommentBlock :


 class CommentBlock { /** @var Comment[]   */ protected $comments = []; /**       `$comments` */ public function getComment(string $key): ?Comment { return $this->comments[$key] ?? null; } } 

рдФрд░ рд╣рдо рдЗрд╕реЗ CustomCommentBlock рд╡рд░реНрдЧ CustomCommentBlock рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ CustomCommentBlock , рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЫреБрдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВред


 class CustomCommentBlock extends CommentBlock { /** *    * *    (information hiding) *     `CommentBlock::$comments`, *     */ public function setComments(array $comments): void { $this->comments = $comments; } /** *    ,   `Comment::getKey()` * *       */ public function getComment(string $key): ?Comment { foreach ($this->comments as $comment) { if ($comment->getKey() === $key) { return $comment; } } return null; } } 

рдЫрд┐рдкрд╛рд╡ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:


  • рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЗ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЗ рдЫрд┐рдкреЗ рд╣реБрдП рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдРрд╕рд╛ рдкрд░рд┐рджреГрд╢реНрдп рд╕рдВрднрд╡рддрдГ рдирд╣реАрдВ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рддрд░реНрдХ рд╕рдВрднрд╡рддрдГ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдЧрд╛ред
    рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рд╕реБрд░рдХреНрд╖рд┐рдд CommentBlock::$comments рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CustomCommentBlock::setComments() рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ CommentBlock::$comments рд╕рдВрдкрддреНрддрд┐ рдореВрд▓ рд╡рд░реНрдЧ рдореЗрдВ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИред
  • рдмрд╛рд▓рдХ рд╡рд░реНрдЧ рдореЗрдВ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреА рдкрджреНрдзрддрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ред рдХрднреА-рдХрднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдмрдЪреНрдЪреЗ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдХрд░ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред
    рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, CommentBlock::getComment() рдореВрд▓ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╡рд┐рдзрд┐ CommentBlock::$comments рдореЗрдВ рдХреБрдВрдЬреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ CommentBlock::$comments рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреАред рдФрд░ рдмрд╛рд▓ рд╡рд░реНрдЧ рдореЗрдВ - рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП, Comment::getKey() рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн Comment::getKey() рд╡рд┐рдзрд┐ред

рдХреЗрд▓рд╛-рдмрдВрджрд░-рдЬрдВрдЧрд▓ рдХреА рд╕рдорд╕реНрдпрд╛


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

рдЬреЛ рдЖрд░реНрдорд╕реНрдЯреНрд░рд╛рдВрдЧ, рдПрд░рд▓рд╛рдВрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛

рд╕рд┐рд╕реНрдЯрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрдИ рдЬрдЯрд┐рд▓ рдХрд╛рд░рдХреЛрдВ рдХреЛ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИред


рдЖрдк рд╢рд╛рдпрдж рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖ рдЧрдП рд╣реИрдВ, рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рдж рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛рдлреА рдмрдврд╝ рдЧрдП рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП


 class Block { /* ... */ } class CommentBlock extends Block { /* ... */ } class PopularCommentBlock extends CommentBlock { /* ... */ } class CachedPopularCommentBlock extends PopularCommentBlock { /* ... */ } /* .... */ 

рдЖрдк рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдпрд╣ рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╕рджрд╕реНрдп рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЖрдк рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рднреА рд╡рд┐рд░рд╛рд╕рддреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдкреИрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдПрдХ рдордЬрдмреВрдд рдирд┐рд░реНрднрд░рддрд╛ рдорд┐рд▓рддреА рд╣реИ, рдкреЗрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рдореВрд▓ рд╡рд░реНрдЧ рдкрд░, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдФрд░ рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрдордЬреЛрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдбреАрдЖрдИрдкреА рдХреЗ рд╕рд╛рде рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ)ред


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


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


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


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


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЦреБрд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐


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


рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рднрд╛рд╖рд╛рдПрдБ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЦреБрд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред PHP рдореЗрдВ, рдЦреБрд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЫрджреНрдо-рдЪрд░ $this рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред $this рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рд╕реНрд╡-рдХреЙрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


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


  • рдбрд╛рдЙрди-рдХреЙрд▓ - рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдХреЙрд▓ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ рдЕрддрд┐рдкреНрд░рдЪрд▓рд┐рдд рд╣реИ, рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХрдо рд╣реИред
  • рдЕрдк-рдХреЙрд▓ - рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореВрд▓ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЙрдЪреНрдЪ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВред рдЖрдк parent::method() рд╕реЗ parent::method() рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PHP рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдбрд╛рдЙрди-рдХреЙрд▓ рдФрд░ рдЕрдк-рдХреЙрд▓ рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрдард┐рди рдФрд░ рднрдВрдЧреБрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реИрдВред рд╣рдо рдореВрд▓ CommentBlock рд╡рд░реНрдЧ рдореЗрдВ getComments() рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИред


 class CommentBlock { /* ... */ /** *        `getComment()`. * *        `CustomCommentBlock`, * ..   `CommentBlock::getComment()`  * `CustomCommentBlock::getComment()` . */ public function getComments(): array { $comments = []; foreach ($this->comments as $key => $comment) { $comments[] = $this->getComment($key); } return $comments; } } 

рдпрд╣ рд╡рд┐рдзрд┐ CommentBlock::getComment() рдХреЗ рддрд░реНрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ CommentBlock::getComment() рдФрд░ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА $comments рдХреА рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ CommentBlock::getComment() ред CustomCommentBlock рд╡рд░реНрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ CommentBlock::getComments() рд╡рд┐рдзрд┐ рд╕реЗ, CommentBlock::getComments() рдХреЗ рдбрд╛рдЙрди-рдХреЙрд▓ CustomCommentBlock::getComment() рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, CustomCommentBlock::getComment() рдкрджреНрдзрддрд┐ рдХрд╛ рдореВрд▓ рд╡рд░реНрдЧ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рднрд┐рдиреНрди рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХреА key рд╕рдВрдкрддреНрддрд┐ рдХреА рдЙрдореНрдореАрдж рд╣реИред


рдирддреАрдЬрддрди, CommentBlock::getComments() рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореВрд▓ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛, CommentBlock::getComments() рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрд╕рдВрдЧрдд рдирд┐рдХрд▓рд╛ред getComments() рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЙрд▓ getComments() рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ null рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реМрдЯрд╛рдПрдЧрд╛ред


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


рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдирд┐рдпрдВрддреНрд░рдг


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


рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди ( рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди) рдореБрдЦреНрдп рдкреНрд░рднрд╛рд╡ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд╕реНрдЯрдо рдХреА рдХреБрдЫ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ - рдХреЙрд▓ рдмрд┐рдВрджреБ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИред рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг:


  • рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдг);
  • рд╕реНрдереИрддрд┐рдХ рдЪрд░ рдХреЛ рд╡рд┐рдзрд┐ рдореЗрдВ рдмрджрд▓рдирд╛;
  • рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрддред

рдЗрд╕рд▓рд┐рдП рдпреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рднреА рд╣реИрдВ, рдЬреЛ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЫрд┐рдкрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ CommentBlock рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ CommentBlock рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CommentBlock рд╡рд░реНрдЧ рдореЗрдВ viewComment() рд╡рд┐рдзрд┐ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 class CommentBlock { /** @var Comment[]   */ protected $comments = []; /**         */ public function viewComment(string $key): string { return $this->comments[$key]->view(); } } 

рдмрд╛рд▓ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рд╣рдо рд╡рд░реНрдЧ CountingCommentBlock рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХреИрд╢ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЧрд┐рдирдиреЗ CommentBlock рдХреНрд╖рдорддрд╛ рдХреЗ CommentBlock рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕ рдХреЛ CounterInterface рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ ( рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЗрдВрдЬреЗрдХреНрд╢рди ) рдореЗрдВ PSR-16- рд╕рдВрдЧрдд рдХреИрд╢ рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рджреЗрдВ (рдЬреЛ рдХрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐, PSR-16 рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ )ред рд╣рдо increment() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╢ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рд╡реИрд▓реНрдпреВ рдХреЛ рдкрд░рдорд╛рдгреБ рд╡реГрджреНрдзрд┐ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред


 class CountingCommentBlock extends CommentBlock { /** @var CounterInterface  */ private $cache; public function __construct(CounterInterface $cache) { $this->cache = $cache; } /**        */ public function viewComment(string $key): string { $this->cache->increment($key); return parent::viewComment($key); } } 

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


 class CommentBlock { /* ... */ /**           */ public function viewComments(): string { $view = ''; foreach ($this->comments as $key => $comment) { $view .= $comment->view(); } return $view; } } 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЛ рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рдХреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИред viewComments() (responsibility) CountingCommentBlock тАУ .


:


 $commentBlock = new CountingCommentBlock(new SomeCache()); /* ... */ $commentBlock->viewComments(); 

. , .


┬л ┬╗ . , viewComments() ( ).



, . , , , . тАУ ┬л ┬╗ (" Fragile base class "). ┬л- ┬╗ тАУ (fragility).


, ? . , CommentBlock , .


 class CommentBlock { /** @var Comment[]   */ protected $comments = []; /**         */ public function viewComment(string $key): string { return $this->comments[$key]->view(); } /**           */ public function viewComments(): string { $view = ''; foreach ($this->comments as $key => $comment) { $view .= $comment->view(); } return $view; } } 

CountingCommentBlock .


 class CountingCommentBlock extends CommentBlock { /** @var CounterInterface  */ private $cache; public function __construct(CounterInterface $cache) { $this->cache = $cache; } /**        */ public function viewComment(string $key): string { $this->cache->increment($key); return parent::viewComment($key); } /**        */ public function viewComments(): string { foreach ($this->comments as $key => $comment) { $this->cache->increment($key); } return parent::viewComments(); } } 

CommentBlock::viewComments() :


 $view .= $comment->view(); 

, viewComment() , тАУ . . viewComment() viewComments() . , CommentBlock::viewComment() CommentBlock::viewComments() :


 class CommentBlock { /* ... */ public function viewComments(): string { $view = ''; foreach ($this->comments as $key => $comment) { $view .= $this->viewComment($key); //  `$comment->view()` } return $view; } } 

CommentBlock , , . CommentBlock тАУ , ┬л┬╗. .


, . CountingCommentBlock . :


 $commentBlock = new CountingCommentBlock(new SomeCache()); /* ... */ $commentBlock->viewComments(); 

:


 CountingCommentBlock::viewComments() -> CommentBlock::viewComments() -> (n ) CountingCommentBlock::viewComment() 

: CountingCommentBlock::viewComments() CountingCommentBlock::viewComment() . рдпрд╛рдиреА тАУ . CountingCommentBlock , , !


, protected . , . . , .


. , . , . , , ┬л - ┬╗.


, . , ┬л ┬╗. ┬л ┬╗ $this , private , .


, . , , . PHP ( public , protected , private ) final .


final


PHP . , , .. , , , . , final .


PHP 5 final , , . , .

#1.
...
#2
...

: , .

PHP, ┬л final ┬╗


PHP . . final , .


, final тАУ PHP, . , PHP : typehints , ..


final , , . рдпрд╛рдиреА , . .


, , private , . , .


, , , API. , ┬л┬╗ , . ┬л┬╗ - . ┬л┬╗ , .


API ┬л ┬╗. , .


, final .


final


┬л ┬╗


тАУ . , public protected .


, , . PHP ( -) . тАУ , , , .


, () . ┬л ┬╗ ( Template method ).


, :


  • . , () . . final . тАУ .
  • . . , . () .

, abstract , , final , . , , . , .. final .


. , , . , . . .., , - , , , . :


  • abstract ;
  • final , , .

. ┬л ┬╗ abstract final .


CommentBlock .


 abstract class CommentBlock { /**   */ protected $comments = []; /**         */ abstract public function viewComment(string $key): string; /**           */ final public function viewComments(): string { $view = ''; foreach ($this->comments as $key => $comment) { $view .= $this->viewComment($key); } return $view; } } 

SimpleCommentBlock :


 final class SimpleCommentBlock extends CommentBlock { public function viewComment(string $key): string { return $this->comments[$key]->view(); } } 

, , :


 final class CountingCommentBlock extends CommentBlock { /**  */ private $cache; public function __construct(CounterInterface $cache) { $this->cache = $cache; } /**        */ public function viewComment(string $key): string { $this->cache->increment($key); return $this->comments[$key]->view(); } } 

┬л┬╗, . final final .


. , . , ┬л ┬╗ down-call , , . .


, , . , .



- , . extends , implements .


- . CommentBlock :


 interface CommentBlock { /**         */ public function viewComment(string $key): string; /**           */ public function viewComments(): string; } 

:


 final class SimpleCommentBlock implements CommentBlock { /**   */ private $comments = []; public function viewComment(string $key): string { return $this->comments[$key]->view(); } public function viewComments(): string { $view = ''; foreach ($this->comments as $key => $comment) { $view .= $this->viewComment($key); } return $view; } } 

, :


 final class CountingCommentBlock implements CommentBlock { /**   */ private $comments = []; /**  */ private $cache; public function __construct(CounterInterface $cache) { $this->cache = $cache; } /**        */ public function viewComment(string $key): string { $this->cache->increment($key); return $this->comments[$key]->view(); } public function viewComments(): string { $view = ''; foreach ($this->comments as $key => $comment) { $view .= $this->viewComment($key); } return $view; } } 

implements - ( association ) .


-, . - . final , : , ..


. . , public . implements , () , , ( ISP ). , .


/ ( OCP )? final implements тАУ PHP .


, , , . , implements , . .


final , . . тАУ , implements final .


┬л ┬╗, . implements , final .


, ┬л ┬╗, , . тАУ SimpleCommentBlock CountingCommentBlock viewComments() .



, viewComments() , , , , . , . ( decorator pattern ). , ┬л ┬╗, тАУ final , implements .


, CommentBlock , .


 interface CommentBlock { /**      */ public function getCommentKeys(): array; /**         */ public function viewComment(string $key): string; /**           */ public function viewComments(): string; } 

, getCommentKeys() . . , protected , CommentBlock .


SimpleCommentBlock - ┬л┬╗ . , , implements final .


 final class SimpleCommentBlock implements CommentBlock { /**   */ private $comments = []; public function getCommentKeys(): array { return array_keys($this->comments); } public function viewComment(string $key): string { return $this->comments[$key]->view(); } public function viewComments(): string { $view = ''; foreach ($this->comments as $key => $comment) { $view .= $this->viewComment($key); } return $view; } } 

CountingCommentBlock - ┬л┬╗ тАУ OCP . CountingCommentBlock : CommentBlock .


 final class CountingCommentBlock implements CommentBlock { /**  CommentBlock */ private $commentBlock; /**  */ private $cache; public function __construct(CommentBlock $commentBlock, CounterInterface $cache) { $this->commentBlock = $commentBlock; $this->cache = $cache; } public function getCommentKeys(): array { return $this->commentBlock->getCommentKeys(); } public function viewComment(string $key): string { $this->cache->increment($key); return $this->commentBlock->viewComment($key); } public function viewComments() : string { $commentKeys = $this->getCommentKeys(); foreach ($commentKeys as $commentKey) { $this->cache->increment($commentKey); } return $this->commentBlock->viewComments(); } } 

- CountingCommentBlock . , viewComment() . ( forwarding methods ).


, ┬л ┬╗. getCommentKeys() . , ┬л┬╗ , , .


, . , - ┬л┬╗ . , тАУ ( , SOLID) ( , , ).


. SimpleCommentBlock CountingCommentBlock CommentBlock , . -, .


, , final , CommentBlock .


SimpleCommentBlock CountingCommentBlock - ┬л ┬╗, . ┬л ┬╗ , . , ┬л ┬╗. тАУ .


, final , . , ┬л--┬╗ тАУ . DIP , .


: SimpleCommentBlock тАУ ; CountingCommentBlock тАУ SimpleCommentBlock , (). рдпрд╛рдиреА , тАУ SRP . , , ( cohesion ) .


┬л ┬╗ тАУ (, , ), , . , .


.


viewRandomComment() SimpleCommentBlock - CountingCommentBlock . , тАУ viewRandomComment() . CountingCommentBlock::viewRandomComment() .


, viewComments() SimpleCommentBlock . CountingCommentBlock SimpleCommentBlock , .


 final class SimpleCommentBlock implements CommentBlock { /* ... */ /**         */ public function viewRandomComment(): string { $key = array_rand($this->comments); return $this->comments[$key]->view(); } /**      */ public function viewComments() : string { $view = ''; foreach ($this->comments as $key => $comment) { /*    `$this->viewComment()`      */ $view .= $this->comments[$key]->view(); } return $view; } } 


: , , , , , .. .


PHP , , final , . , , , . , . . тАУ , тАУ .


, . PHPDoc , . : .


, , (.. , public protected ). PSR-19: PHPDoc tags , , . PHPDoc , ┬л -┬╗.


JavaDoc @implSpec , . , PHPDoc API , .. public . @implSpec , API . , protected .


 class CommentBlock { /* ... */ /** *         *       *  (,    ) * * @implSpec      `$key` *    `$this->comments`      `view()` * * @param string $key   * @return string    */ public function viewComment(string $key): string { return $this->comments[$key]->view(); } } 

PHPDoc @implSpec . $key . тАУ view() .


, @implSpec :


  • ( , , , ..).
  • parent::method() .

, ┬л┬╗ . , self-call ( $this ) , , :


  • $this ;
  • ;
  • .

 class CommentBlock { /* ... */ /** *           * * @implSpec    `$this->comments` *        `$this->viewComment()`. *       . * * @return string     */ final public function viewComments(): string { $view = ''; foreach ($this->comments as $key => $comment) { $view .= $this->viewComment($key); } return $view; } } 

, viewComments() final . viewComment() , . :


  • viewComment() viewComments() ;
  • viewComments() viewComment() .

, . , , . ┬л ┬╗, CommentBlock CountingCommentBlock , . viewComment() viewComments() , , .


, , . PHPDoc API : , , .


, , , , , , ┬л┬╗. тАУ . PHPDoc , .


, , . тАУ final , . . тАУ ┬л ┬╗.


:


  • . ;
  • final . .

, , final . final , . , . , ?


final . , , . , , final , .


final


┬л ┬╗, , , , , . , protected . , final тАУ , , , public , .


, , . , , , . тАУ final .


, final ? рдирд╣реАрдВред - , Opensource , , . IDE . , .


, , final . final , . .


final , . public ? тАУ , ?


, . , final , , protected .


final , code review ( code review ? ;). , .


  • final ? ? ?
  • final ? ? ?

. , , code review . .


. final PHP5 . , , ( , ) .


, , . ┬л ┬╗ , . , C# virtual , тАУ override . PHP final extandable , ┬л final ┬╗, extend .



, тАУ . . . .


. , . , . final , , -. , , implements .


, , final .


  1. final :


     final class SimpleCommentBlock { /* ... */ public function getCommentKeys(): array { /* ... */ } public function viewComment(string $key): string { /* ... */ } public function viewComments(): string { /* ... */ } } 

  2. . , final . , . .


    , public . , , .


    , .


     interface CommentBlock { public function getCommentKeys(): array; public function viewComment(string $key): string; public function viewComments(): string; } 

  3. .


     final class SimpleCommentBlock implements CommentBlock { /* ... */ } 

  4. -, . - CommentBlock . - .


     final class CountingCommentBlock implements CommentBlock { /* ... */ private $commentBlock; public function __construct(CommentBlock $commentBlock /* ,... */) { $this->commentBlock = $commentBlock; } /* ... */ } 


, . , final , , - . , final .


final , . , ┬л┬╗. , . final .


final


final тАУ ( PHPUnit, Mockery ) ┬л┬╗ ( test doubles ). , .


, :


 final class SimpleCommentBlockTest extends TestCase { public function testCreatingTestDouble(): void { $mock = $this->createMock(SimpleCommentBlock::class); } } 

:


 Class "SimpleCommentBlock" is declared "final" and cannot be mocked. 

, ┬л ┬╗ PHPUnit , :


 class Mock_SimpleCommentBlock_591bc3f3 extends SimpleCommentBlock { /* ... */ } 

┬л┬╗ . -, , .. . , -, , PHPUnit . , .


final . : . .



тАУ ┬л┬╗ . , ( Post , Comment ) - ( value object ) ( stable ) . . classical TDD ( mockist TDD )


, ( volatile ) . , , ┬л┬╗ тАУ , . , ┬л┬╗ , . ( DIP ), , ┬л┬╗ .


, . рдпрд╛рдиреА :


 interface CommentBlock { /* ... */ } 

:


 final class SimpleCommentBlock implements CommentBlock { /* ... */ } 

┬л┬╗ :


 final class CommentBlockTest extends TestCase { public function testCreatingTestDouble(): void { $mock = $this->createMock(CommentBlock::class); } } 

┬л┬╗ , . :


  • ┬л┬╗ ;
  • ;
  • ┬л┬╗ , .. DIP .


, ┬л┬╗ тАУ , -. , ( , ). , ┬л ┬╗ ┬л ┬╗.


, final .


тАУ -. -. , -, . Mockery .


 class SimpleCommentBlockTest extends TestCase { public function testCreatingProxyDouble() { /*    */ $simpleCommentBlock = new SimpleCommentBlock(); /*  - */ $proxy = Mockery::mock($simpleCommentBlock); /*    */ $proxy->shouldReceive('viewComment') ->andReturn('text'); /*     */ $this->assertEquals('text', $proxy->viewComment('1')); /* `$proxy`     `SimpleCommentBlock`  */ $this->assertNotInstanceOf(SimpleCommentBlock::class, $proxy); } } 

тАУ - . , instanceof . ( type declarations ), - .


┬л ┬╗ тАУ PHP, , . Bypass Finals , final . composer final :


 public function testUsingBypassFinals(): void { /*   `final` */ BypassFinals::enable(); $mock = $this->createMock(SimpleCommentBlock::class); } 

final


, PHP . ┬л ┬╗ , final . , IDE final .


PHPStorm


PHPStorm . File | Settings | Editor | File and Code Templates Files PHP Class . final .


`PHP Class`


File | New | PHP Class :


 final class SimpleCommentBlock { } 

, . . тАУ .


PHPStorm Refactor | Extract | Interface . , . ( Replace class reference with interface where possible ) PHPDoc ( Move PHPDoc ).


:


 interface CommentBlock { /** PHPDoc */ public function viewComment(string $key): string; } 

:


 final class SimpleCommentBlock implements CommentBlock { public function viewComment(string $key): string { /* ... */ } } 

File | New | PHP Class -, . :


 final class CountingCommentBlock implements CommentBlock { /** @var CommentBlock */ private $commentBlock; } 

Code | Generate | Constructor . .


 final class CountingCommentBlock implements CommentBlock { /* ... */ public function __construct(CommentBlock $commentBlock) { $this->commentBlock = $commentBlock; } } 

тАУ . Code | Generate | Implement Methods . , . PHPStorm ┬л┬╗ , IntelliJ IDEA ReSharper .


 final class CountingCommentBlock implements CommentBlock { /* ... */ /** * @inheritDoc */ public function viewComment(string $key): string { // TODO: Implement viewComment() method. } } 

PHPDoc . .


PHPStan


, . , , , final . ( ).


PHPStan . ┬л ┬╗ . PHPStan . .


FinalRule localheinz/phpstan-rules . PHPStan\Rules\Rule processNode() .


. , FinalRule ┬л ┬╗ allowAbstractClasses . , , classesNotRequiredToBeAbstractOrFinal .


, composer :


 composer require --dev phpstan/phpstan composer require --dev localheinz/phpstan-rules 

FinalRule phpstan.neon :


 services: - class: Localheinz\PHPStan\Rules\Classes\FinalRule arguments: allowAbstractClasses: true classesNotRequiredToBeAbstractOrFinal: [] tags: - phpstan.rules.rule 

( max ):


 vendor/bin/phpstan -lmax analyse src 

:


  ------ ------------------------------------------------------------------------ Line CommentBlock.php ------ ------------------------------------------------------------------------ 10 Class CommentBlock is neither abstract nor final. ------ ------------------------------------------------------------------------ 

JSON Continuous Integration .


рдирд┐рд╖реНрдХрд░реНрд╖


, : final ! IDE, .


, , . тАУ SOLID . , , .


, . :


  • ;
  • final , , , ;
  • .

, - - . . . , , , , . , . ?


, тАУ , . final . ( cognitive load ) тАУ . тАУ .


: final . . тАУ . . . , . , .


final . ( SOLID ) ( fragile ) . , .

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


All Articles