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

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

рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдордЬрдмреВрдд рд╕рдВрдмрдВрдз
рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕реНрд╡рдпрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдкреНрд░рдХрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ рдЬрдм рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрд╖реИрддрд┐рдЬ рдХреЛрдб рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ extends ParentClass
рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИ! рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдПрдХрддреНрд░реАрдХрд░рдг, рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди (DI), рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрд╡рдВрдЯрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рд╡рдВрд╢рд╛рдиреБрдЧрдд рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╡рд░реНрдЧ рд▓рд┐рдВрдХреЗрдЬ рдХреА рдХрдореА рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЧреБрдВрдЬрд╛рдЗрд╢ ( private
, protected
) рдХреЗ рдкреНрд░рддрд┐рдмрдВрдзрдХ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ рд░рд╛рдп рдпрд╣ рднреА рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ private
рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ protected
рд╕рдВрд╢реЛрдзрдХ рдХреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдФрд░ рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд░рд╛рд╕рдд рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рди рдХреЗрд╡рд▓ рдЧреБрдгреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдореЗрдВ рд╣реИрдВ, рд╡реЗ рдмрд╣реБрдд рдЧрд╣рд░реЗ рд╣реИрдВред рдХреНрд▓рд╛рд╕рд┐рдХ рдЧреЛрдл рдкреБрд╕реНрддрдХ рд╕рд╣рд┐рдд рдЖрд╡реЗрджрди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╛рд╣рд┐рддреНрдп, рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╣ рд╕реЗ рднрд░реЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреА рдУрд░ рджреЗрдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд▓рдЪреАрд▓рд╛рдкрди рд╣реИ? рдореИрдВ рд╡рд┐рд░рд╛рд╕рдд рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдирд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛ рдЬрд╛рдПред
рдЪрд▓реЛ "рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЦрд░рдЧреЛрд╢" рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдПрдХ рд╕рд░рд▓ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгреА рдмреНрд▓реЙрдХ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд░реНрдЧ рд▓реЗрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЕрдВрджрд░ рд╕рдорд╛рди рдХрдХреНрд╖рд╛рдПрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИрдВред
class CommentBlock { private $comments = []; }
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдЬрд╛рдирдмреВрдЭ рдореЗрдВ рд╕рд░рд▓реАрдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ KISS рдХреЛрдб рддреИрдпрд╛рд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реИрд▓реАред рдЖрдк рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдПрдиреЛрдЯреЗрд╢рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдореБрджреНрджреЗ
рдЖрдЗрдП рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рджреА рдЧрдИ рд╣реИред
рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЫреБрдкрд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ
рдЪреВрдВрдХрд┐ рдЙрдкрд╡рд░реНрдЧ рдореЗрдВ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо encapsulation рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред
GoF, рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди
рдпрджреНрдпрдкрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдкреБрд╕реНрддрдХ, рдж рдЧреИрдВрдЧ рдСрдлрд╝ рдлреЛрд░, рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдЙрд▓реНрд▓рдВрдШрдиреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдпрд╣ рдХрд╣рдирд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдЧрд╛ рдХрд┐ "рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЫреБрдкрд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ ред " рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдбреЗрдЯрд╛ рдЙрдирдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рд╣реИред рд▓реЗрдХрд┐рди рдЫреБрдкрд╛рдиреЗ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд┐рд░реНрдл рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдЫрд┐рдкрд╛рд╡ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рд╕реЗ рд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рдЧрд╛рдИ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рд╡рд░реНрдЧ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рд╕рднреА рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ред
рдпрд╛рдиреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╛рд▓ рд╡рд░реНрдЧ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдкрдиреЗ protected
рдЧреБрдгреЛрдВ рдореЗрдВ рдЫрд┐рдкреЗ рдореВрд▓ рд╡рд░реНрдЧ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЕрдХреНрд╕рд░, рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреЛ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЗ рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдХреБрдЫ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреБрдирд┐рдВрджрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ protected
рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рдкреЗрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИред
рдХрдХреНрд╖рд╛ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореВрд▓ рд╡рд░реНрдЧ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдХ рдкрд╣реБрдВрдЪ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рдЖрддреА рдереАрдВ, рддреЛ рдЬреИрд╕реЗ рд╣реА рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕ рдкрд╣реБрдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд▓ рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд▓рд┐рдВрдХ рдХреЛ рдордЬрдмреВрдд рдХрд░рддрд╛ рд╣реИред
рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЛ рдЕрдм рди рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ , рдмрд▓реНрдХрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рднреА рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХрд╛рдо рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдБ рдЖрдПрдВрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, protected
рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд╛рд╣рд░реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рддред рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рдХреЗрд╡рд▓ public
рдФрд░ private
рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, protected
рдХреАрд╡рд░реНрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдмрд╛рд▓ рд╡рд░реНрдЧ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рдХрд╛ рд╣рд░ рдЕрд╡рд╕рд░ рд╣реИред рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЦрд░рд╛рдм рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдкрд╣рд▓реЗ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдПрдХ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫреБрдкрд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди
рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ (рд╕реНрдерд┐рд░рд╛рдВрдХ, рдЧреБрдг, рд╡рд┐рдзрд┐рдпрд╛рдБ) рди рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдмрдЪреНрдЪреЗ рдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рдЦрддрд░реЗ рд╕реЗ рднрд░рд╛ рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдмрдЪреНрдЪреЗ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореВрд▓ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдб рдореЗрдВ рдЙрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдмрд╛рд▓ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рдореВрд▓ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рдирд╛ рдерд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо CommentBlock
рд╡рд░реНрдЧ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ CommentBlock
:
class CommentBlock { protected $comments = []; public function getComment(string $key): ?Comment { return $this->comments[$key] ?? null; } }
рдФрд░ рд╣рдо рдЗрд╕реЗ CustomCommentBlock
рд╡рд░реНрдЧ CustomCommentBlock
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ CustomCommentBlock
, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЫреБрдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВред
class CustomCommentBlock extends CommentBlock { public function setComments(array $comments): void { $this->comments = $comments; } 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 { 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 { 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 { 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 { 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 { 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);
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 .
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 { 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) { $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 { public function viewComment(string $key): string { return $this->comments[$key]->view(); } }
PHPDoc @implSpec
. $key
. тАУ view()
.
, @implSpec
:
- ( , , , ..).
parent::method()
.
, ┬л┬╗ . , self-call ( $this
) , , :
class CommentBlock { 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
┬л ┬╗, , , , , . , protected . , final
тАУ , , , public , .
, , . , , , . тАУ final
.
, final
? рдирд╣реАрдВред - , Opensource , , . IDE . , .
, , final
. final
, . .
final
, . public ? тАУ , ?
, . , final
, , protected .
final
, code review ( code review ? ;). , .
. , , code review . .
. final
PHP5 . , , ( , ) .
, , . ┬л ┬╗ , . , C# virtual
, тАУ override
. PHP final
extandable
, ┬л final
┬╗, extend
.
, тАУ . . . .
. , . , . final
, , -. , , implements
.
, , final
.
final
:
final class SimpleCommentBlock { public function getCommentKeys(): array { } public function viewComment(string $key): string { } public function viewComments(): string { } }
. , final
. , . .
, public
. , , .
, .
interface CommentBlock { public function getCommentKeys(): array; public function viewComment(string $key): string; public function viewComments(): string; }
.
final class SimpleCommentBlock implements CommentBlock { }
-, . - 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); } }
┬л┬╗ , . :
, ┬л┬╗ тАУ , -. , ( , ). , ┬л ┬╗ ┬л ┬╗.
, 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')); $this->assertNotInstanceOf(SimpleCommentBlock::class, $proxy); } }
тАУ - . , instanceof
. ( type declarations ), - .
┬л ┬╗ тАУ PHP, , . Bypass Finals , final
. composer final
:
public function testUsingBypassFinals(): void { 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
.

File | New | PHP Class :
final class SimpleCommentBlock { }
, . . тАУ .
PHPStorm Refactor | Extract | Interface . , . ( Replace class reference with interface where possible ) PHPDoc ( Move PHPDoc ).
:
interface CommentBlock { 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 { 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 { public function viewComment(string $key): string {
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
. ( cognitive load ) тАУ . тАУ .
: final
. . тАУ . . . , . , .
final
. ( SOLID ) ( fragile ) . , .