
12 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ PHP рдХреЛрдб (рд▓рд╛рдЦреЛрдВ рд▓рд╛рдЗрдиреЗрдВ) рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж 12 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд▓рд┐рдЦреА рдЧрдИ рд▓рд╛рдЗрдиреЗрдВ рднреА рд╕рдВрд░рдХреНрд╖рд┐рдд рдереАрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ PHP 4 рдФрд░ PHP 5 рдХреЗ рджрд┐рдиреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рд╣реИрдВред рд╣рдо рджрд┐рди рдореЗрдВ рджреЛ рдмрд╛рд░ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд▓рдЧрднрдЧ 10-20 рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддрддреНрдХрд╛рд▓ рдкреИрдЪ - рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрддрди рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЪ рдХреЗ рджрд┐рди, рд╣рдо рдХреБрдЫ рджрд░реНрдЬрди рд╣рд╛рд╕рд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдорд╛рд░рд╛ рдХреЛрдб рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред
рд╣рдо рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдПрдХ рджрд┐рди рд╣рдордиреЗ рд╕реНрдереИрддрд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдХреНрдпрд╛ рдЖрдпрд╛, рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдкрдврд╝рд╛ред
рд╕рдЦреНрдд рдкреНрд░рдХрд╛рд░: рд╣рдо рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдПрдХ рдмрд╛рд░, рд╣рдорд╛рд░реЗ рдХреЙрд░реНрдкреЛрд░реЗрдЯ PHP рдЪреИрдЯ рдореЗрдВ рдПрдХ рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рд╣реБрдИред рдирдП рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреВрд░реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕рдЦреНрдд_рдЯрд╛рдЗрдк + рд╕реНрдХреЗрд▓рд░
рдЯрд╛рдЗрдк рд╕рдВрдХреЗрдд рдкреЗрд╢ рдХрд┐рдП - рдФрд░ рдЗрд╕рд╕реЗ рдЙрддреНрдкрд╛рджрди рдкрд░ рдХреАрдбрд╝реЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рдлреА рдХрдореА рдЖрдИред
рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреИрдЯ рдкреБрд░рд╛рдиреЗ рд╕рдордп рдХреЗ рд▓реЛрдЧ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд╡рд╛рдЪрд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдереЗред рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рдерд╛ рдХрд┐ PHP рдореЗрдВ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХреЛрдб рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХрд╛ 100% рдХрд╡рд░реЗрдЬ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреЛрдЦрд┐рдо рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрд╛рджрди рдкрд░ рдкреЙрдк рдЕрдк рд╣реЛрдВрдЧреА, рдЬреЛ рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рд╕рдЦреНрдд_рдЯрд╛рдЗрдкреНрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреЗрдореЗрд▓ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рддрд┐рд╢рдд рдкрд╛рдПрдВрдЧреЗ рдФрд░ рдХреИрд╕реЗ PHP "рдЪреБрдкрдЪрд╛рдк" рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреБрднрд╡реА PHP рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ PHP рдореЗрдВ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдо рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡реЗ рд╕рд╣реА, рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдгрд╛рд▓реА рд╣реЛрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЬрд╣рд╛рдВ рдХреЛрдб рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмреЗрдореЗрд▓ рд╣реИ, рд╣рдореЗрдВ рдкрд╕рдВрдж рдЖрдпрд╛ред рд╣рдордиреЗ рд╕рдЦреНрдд_рдЯрд╛рдЗрдкреНрд╕ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред
рдкрд╣рд▓реЗ рддреЛ рд╣рдо рднреА PHP рдкреИрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдХреЗрд▓рд░ рдЯрд╛рдЗрдк (int int) рдХрд╣реЗ, рдФрд░ рджреВрд╕рд░рд╛ рд╕реНрдХреЗрд▓рд░ рдЯрд╛рдЗрдк (рдЬреИрд╕реЗ рдлреНрд▓реЛрдЯ) рдЖрддрд╛ рд╣реИ, рддреЛ TypeError (рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИ) рдХреЛ рдлреЗрдВрдХрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдЧрд╛, рдпрджрд┐ рд╕рд╛рде рд╣реА рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ error.log рдореЗрдВ рд▓реЙрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдЙрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реА рдзрд╛рд░рдгрд╛ рдЧрд▓рдд рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреИрдЪ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВред
рд╣рдордиреЗ PHP рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рдордп рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рдлрд╝рд╛рди рд╕реНрдЯреИрдЯрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреА рдкрд╣рд▓реА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓рд╛ рдХрдорд┐рдЯрдореЗрдВрдЯ рдЦреБрдж рд░рд╛рд╕рдорд╕ рд▓реЗрд░рдбреЛрд░реНрдл рдиреЗ рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрдЯреИрдЯрд┐рдХ рдХреЛрдб рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╕реНрдерд┐рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреНрдпрд╛ рд╣реИ?
рд╕реНрдЯреИрдЯрд┐рдХ рдХреЛрдб рдПрдирд╛рд▓рд╛рдЗрдЬрд░ рд╕рд┐рд░реНрдл рдХреЛрдб рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЧреЛрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЕрдзрд┐рдХ рдореБрд╢реНрдХрд┐рд▓ рд╡рд╛рд▓реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рдХреА рдмреЗрдореЗрд▓, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдпрд╛ рдХреЛрдб рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ)ред рдХреБрдВрдЬреА рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рд╡реЗред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкрд╛рда рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ (рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВред
рдПрдХ рд╕реНрдерд┐рд░ PHP рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг PHPStorm рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдг рд╣реИ: рдЬрдм рдЖрдк рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, рд╡рд┐рдзрд┐рдпреЛрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдмреЗрдореЗрд▓, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдХреЙрд▓ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, PHPStorm рдЖрдкрдХреЗ PHP рдХреЛрдб рдХреЛ рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛ рд╣реИ - рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЙрди рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдПрдХ рдФрд░ рд╡рд░реНрдЧ рд╣реИ - рд╡реЗ рдХреЛрдб рдХреА рд▓реЗрдЦрди рд╢реИрд▓реА, рд╕рд╛рдЗрдХреНрд▓реЛрдореИрдЯрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛, рд╡рд┐рдзрд┐ рдХреЗ рдЖрдХрд╛рд░, рд░реЗрдЦрд╛ рдХреА рд▓рдВрдмрд╛рдИ рдЖрджрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдпрд╣рд╛рдВ рдРрд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЬреЛ analyzers рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдареАрдХ рдПрдХ рдЧрд▓рддреА рд╣реИред рдЧрд▓рддреА рд╕реЗ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдб рдЬреЛ рдЙрддреНрдкрд╛рджрди рдкрд░ рдмрдирд╛ рджреЗрдЧрд╛ред рдмрд╣реБрдд рдмрд╛рд░, рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛ рдкрд╛рддреЗ рд╣реИрдВ рд╡рд╣ рдЕрдзрд┐рдХ рдЕрд╢реБрджреНрдзрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PHPDoc рдореЗрдВ рдПрдХ рдЧрд▓рдд рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрд╢реБрджреНрдзрд┐ рдХреЛрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдЧрд╛ - рдПрдХ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЧрд▓рддреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдореМрдЬреВрджрд╛ PHP рдХреЛрдб рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░
рддреАрди рд▓реЛрдХрдкреНрд░рд┐рдп PHP рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реИрдВ:
- PHPStan ред
- рднрдЬрди ред
- рдлрд╛рди ред
рдФрд░
рдПрдХреНрдЬрд╛рдХреИрдЯ рд╣реИ , рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЖрдЬрдорд╛рдпрд╛ рдирд╣реАрдВ рд╣реИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдУрд░ рд╕реЗ, рд╕рднреА рддреАрди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕рдорд╛рди рд╣реИрдВ: рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ), рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЖрдк рд╕рдВрдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдореВрд╣ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдк JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рднреА рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ CI рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддреАрдиреЛрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЕрдм рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИрдВред GitHub рдкрд░ рдореБрджреНрджреЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдЙрдирдХреЗ рдЕрдиреБрдЪрд░ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рд╣реИрдВред рдЕрдХреНрд╕рд░ рдЯрд┐рдХрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рджрд┐рди рд╡реЗ рдЗрд╕ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВ (рдЯрд┐рдкреНрдкрдгреА / рдмрдЧ / рд╡реГрджреНрдзрд┐ рдЬреИрд╕реЗ рдЯреИрдЧ рд▓рдЧрд╛рддреЗ рд╣реИрдВ)ред рд╣рдореЗрдВ рдорд┐рд▓реЗ рдХрдИ рдХреАрдбрд╝реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдареАрдХ рд╣реЛ рдЧрдПред рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВрдЯреЗрдирд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВред
рд╣рдордиреЗ рддреАрдиреЛрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ, рдЕрдкрдиреЗ рдмрдЧ рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддреАрди рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдВ рд╣реИ рдФрд░ рдЧрд▓рдд рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХрд╣рд╛рдВ рд╣реИред
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рд╕рднреА рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред
рдорд╛рдирдХ рдЬрд╛рдБрдЪ
рдмреЗрд╢рдХ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдирдХ рдХреЛрдб рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ:
- рдХреЛрдб рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ;
- рд╕рднреА рд╡рд░реНрдЧреЛрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ, рдХрд╛рд░реНрдпреЛрдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдореМрдЬреВрдж рд╣реИрдВ;
- рдЪрд░ рдореМрдЬреВрдж рд╣реИрдВ;
- PHPDoc рдореЗрдВ, рд╕рдВрдХреЗрдд рд╕рд╣реА рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рд░реНрд╕ рдЕрдкреНрд░рдпреБрдХреНрдд рддрд░реНрдХреЛрдВ рдФрд░ рдЪрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рдХреЛрдб рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕рд╛ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИрдВред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЪреНрдЫреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдРрд╕реА рдЧрд▓рддрд┐рдпрд╛рдБ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рд╣рдо рдЬрд▓реНрджреА рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рд╣рдо рдмрд╕ рдЕрд╕рд╛рд╡рдзрд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпреЗ рдЪреЗрдХ рдмрд╣реБрдд рдмрдЪрдд рдХрд░рддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ
рдмреЗрд╢рдХ, рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдорд╛рдирдХ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдХрд╣рддрд╛ рд╣реИ, int, рддреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдРрд╕реА рдЬрдЧрд╣реЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреА рдЧрдВрднреАрд░рддрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдЦреНрдд_рдЯрд╛рдЗрдк рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рдмреВрд▓рд┐рдпрди рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдорд╛рдирдХ рдЬрд╛рдВрдЪ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╢реНрд▓реЗрд╖рдХреЛрдВ рдХреЛ рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рд╣реИред
рд╕рдВрдШ рдХреЗ рдкреНрд░рдХрд╛рд░рд╕рднреА рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:
function isYes($yes_or_no) :bool { if (\is_bool($yes_or_no)) { return $yes_or_no; } elseif (is_numeric($yes_or_no)) { return $yes_or_no > 0; } else { return strtoupper($yes_or_no) == 'YES'; } }
рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ - рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░
string|int|bool
рдХрд╛ рдкреНрд░рдХрд╛рд░
string|int|bool
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣реА рд╣реИ,
$yes_or_no
рдЪрд░ рдпрд╛ рддреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдкреВрд░реНрдгрд╛рдВрдХ, рдпрд╛
Boolean
ред
PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди PHPDoc рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдХрдИ рд╕рдВрдкрд╛рджрдХ (рдЬреИрд╕реЗ PHPStorm) рдЗрд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВред
рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ
рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдРрд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдордиреЗ рдЙрдкрд░реЛрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рд╣реИ (
Boolean
рдЬрд╛рдБрдЪ рдХреЗ рдмрд┐рдирд╛):
function isYes($yes_or_no) :bool { if (is_numeric($yes_or_no)) { return $yes_or_no > 0; } else { return strtoupper($yes_or_no) == 'YES'; } }
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдпрд╣ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╛ рддреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рдмреВрд▓рд┐рдпрди рд╕реНрдЯреНрд░реИрдкрд░ рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЖрдк рд╕реНрдЯреВрд▓рдкрд░ рдХреЛ рдмреВрд▓рд┐рдпрди рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдЬрдм рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдпрд╛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЕрдХреНрд╕рд░ рдРрд╕реЗ рдХрд╛рд░реНрдп рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рдпрд╛
null
рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣рд╛рдВ
$User
рдЪрд░
null
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреЛрдб рдШрд╛рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЧрд▓рдд рдЯрд╛рдЗрдк рдХрд░реЗрдВPHP рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА, рдХреБрдЫ рдХрд╛рд░реНрдп рдРрд╕реЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рдорд╛рди рдпрд╛ рдЕрд╕рддреНрдп рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ?
function fopen(...) { тАж }
рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд▓рдЧрддрд╛ рд╣реИ: рдлрд╝реЛрдкреЗрди рдпрд╛ рддреЛ рд╕рдВрд╕рд╛рдзрди рдпрд╛
false
(рдЬреЛ рдХрд┐
Boolean
) рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╣ рдЗрд╕ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрдЯ рд╕реЗ
рдХрд┐рд╕реА рднреА рдорд╛рди рдХреЛ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐
fopen()
true
рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛
true
ред рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдХреЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ:
$fp = fopen('some.file','r'); if($fp === false) { return false; } fwrite($fp, "some string");
рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐
fwrite
рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрд╕рд╛рдзрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо
bool
рдкрд╛рд╕
bool
(рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдЪреНрдЪрд╛ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИ)ред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╕рднреА рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕ рддрд░рд╣ рдХреЗ "рдХреГрддреНрд░рд┐рдо" рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ
false
рд╕рдордЭрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо
@return false|resource
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
@return false|resource
PHPStorm рднреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рдордЭрддрд╛ рд╣реИред
рд╕рд░рдгреА рдЖрдХрд╛рд░рдмрд╣реБрдд рдмрд╛рд░, PHP рдореЗрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдПрдХ
record
рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреА рд╕реНрдкрд╖реНрдЯ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Badoo рдореЗрдВ рдмрд╣реБрдд рд╕реА рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рд╣реИрдВ, рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рднреА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреБрдЫ рдПрдХ-рд╕рдордп рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕реЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдРрд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдореЗрдВ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ (рдЦреЗрддреЛрдВ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА) рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ "рдмрд╛рдПрдВ" рдХреБрдВрдЬреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЖрдЧреЗ рдХреЛрдб рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдкрдХреЛ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:
function showUrl(array $parsed_url) { тАж }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рддреАрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝реАрд▓реНрдб:
scheme, host
рдФрд░
path
рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣рдо рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕рд░рдгреА рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ "рдЕрдиреБрдорд╛рди" рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред :)
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рдЦрд╛рдореА рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдк рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдЫрджреНрдо рд╡рд┐рд╖рдп рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдФрд░ рдлрд┐рд░ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рд╕рд░рдгреА рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде PHPDoc рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╕рд░рдгреА рдХреЗ рдкрд╛рд╕ рдХрдИ рдлрд╝реАрд▓реНрдб рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛ (рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдирд┐рдХрд╛рд▓реЗрдВ)ред
рд╕рд░рдгреА рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрдиPHP рдореЗрдВ, рд╕рд░рдгреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рддрд╛рд░ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдкреНрд░рдХрд╛рд░ рдХрднреА-рдХрднреА рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг (рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рднреА) рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдЯреЗрдЯрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдкрдХреЛ PHPDoc рдореЗрдВ рд╕рд░рдгреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:
$users = UserLoaders::loadUsers($user_ids);
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, PHPDoc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдПрдХ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐
$users
рд╕рд░рдгреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдкреВрд░реНрдгрд╛рдВрдХ рдЗрдиреНрдЯрд╕ рд╣реИрдВ, рдФрд░ рдорд╛рди
\User
рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред рд╣рдо рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ \ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ [] рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рд╕рд░рдгреА рдореЗрдВ
\User
рд╡рд░реНрдЧ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрддрд╛рдПрдЧрд╛ред
PHPStorm, рд╕рдВрд╕реНрдХрд░рдг 2018.3 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╡рд░реНрдгрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
PHPDoc рдореЗрдВ рдЖрдкрдХрд╛ рдирд╛рдо рд╕реНрдерд╛рдиPHPStorm (рдФрд░ рдЕрдиреНрдп рд╕рдВрдкрд╛рджрдХ) рдФрд░ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ PHPDoc рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ:
function showUrl($parsed_url) { тАж }
рд▓реЗрдХрд┐рди PHPStorm рдЙрд╕реЗ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
function showUrl($parsed_url) { тАж }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛрдиреЛрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдФрд░ PHPStorm рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдВрдЧреЗред PHPStorm
@param
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ PHPDoc рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
PHP рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬрд╛рдБрдЪ
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреНрдпрд╛ рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐
рд╡рд┐рд╕реНрдлреЛрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рд╕реЗ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЧрд▓рдд рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрд╢рдХреНрдд рдФрд░ рддреНрд░реБрдЯрд┐ рджреЛрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧрд▓рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЧрд▓рдд рдорд╛рди рдЧреБрдЬрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдм рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред
рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЧрд▓рдд рдпрд╛ рдПрдХ рд╕рд░рдгреА рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рддреЛ рдХреЛрдб рдХреЛ рдЭреВрдареЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрдлреЛрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рддрднреА рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕реАрдорд╛рдВрдХрдХ (рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░) рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред рдЕрдХреНрд╕рд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рдЬрдЧрд╣ рдореЗрдВ рд╡рд┐рд╕реНрдлреЛрдЯ () рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЭреВрдареА рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
PHP рдореЗрдВ рдРрд╕реА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдЙрдкрдпреБрдХреНрдд рдЪреЗрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕реБрдзрд╛рд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░, рдЕрдм рдЗрди рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред
PHPStan
рдЪреЗрдХ рдЧрдгрд░рд╛рдЬреНрдп рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд Ond┼Щej Mirtes рдХрд╛ рд╡рд┐рдХрд╛рд╕ред 2016 рдХреЗ рдЕрдВрдд рд╕реЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рддред
PHPStan рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:
- рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ)ред
- (рд╡реИрдХрд▓реНрдкрд┐рдХ) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
- рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╕ рдЪрд▓рд╛рдПрдВ:
vendor/bin/phpstan analyse ./src
(
src
рдмрдЬрд╛рдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред
PHPStan рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ PHP рдХреЛрдб рдкрдврд╝реЗрдЧрд╛ред рдпрджрд┐ рд╡рд╣ рдЕрдЬреНрдЮрд╛рдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдЯреЛрд▓реИрдб рдХреЗ рд╕рд╛рде рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдЖрдк
Bootstrap
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрде рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдк рдСрдЯреЛрд▓реЙрдб рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ PHPStan рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╛рдЗрд▓реЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВред
рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
- рд╕рдВрдкреВрд░реНрдг рдХреЛрдб рдЖрдзрд╛рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ - рдЕрдЬреНрдЮрд╛рдд рдХрдХреНрд╖рд╛рдПрдВ PHPStan рдСрдЯреЛрд▓реЙрдб рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧреАред
- рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреА рдХреБрдЫ рдХрдХреНрд╖рд╛рдПрдВ рдСрдЯреЛрд▓реЙрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ PHPStan рдЙрдиреНрд╣реЗрдВ рдвреВрдВрдв рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛ред
- рдпрджрд┐ рдЖрдк
__call / __get / __set
рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк PHPStan рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рдореНрдлрдиреА, рд╕рд┐рджреНрдзрд╛рдВрдд, рд▓рд╛рд░рд╡реЗрд▓, рдореЙрдХрд░реА, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВред
- рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, PHPStan рди рдХреЗрд╡рд▓ рдЕрдЬреНрдЮрд╛рдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдСрдЯреЛрд▓реЙрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЧрдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреБрд░рд╛рдиреЗ рдХреЛрдб рд╣реИрдВ, рдЬрдм рд╣рдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рддреБрд░рдВрдд рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрднрд╡рддрдГ, рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЛ рднреА рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдСрдЯреЛрд▓реЙрдб (
include
) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдирд┐рдпреЛрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХрдиреНрдлрд┐рдЧреНрд╕ (рдореИрдВрдиреЗ рдХрднреА рдирд╣реАрдВ рд╕реБрдирд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рдФрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
- рдЙрдирдХреЗ
@phpstan-var, @phpstan-return
рдЯреИрдЧ рдЬреИрд╕реЗ @phpstan-var, @phpstan-return
, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред
рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдкрд╛рда рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдкрд╛рда рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
Method \SomeClass::getAge() should return int but returns int|null
Method \SomeOtherClass::getName() should return string but returns string|null
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рджреЛрдиреЛрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ: рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рджреВрд╕рд░реЗ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЧреНрд░рдВрде рдЕрд▓рдЧ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдорд╛рди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк PHPStan рдореЗрдВ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реЗрдВред
рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рди рдореЗрдВ, рдРрд╕реА рддреНрд░реБрдЯрд┐
PhanPossiblyNullTypeReturn
рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИ, рдФрд░ рдЖрдк рдЙрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдЪреВрдВрдХрд┐ рд╣рдо рд▓рд╛рд░рд╡реЗрд▓, рд╕рд┐рдореНрдлрдиреА, рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, PHPStan рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд▓рд╛рд╡рд╛рд░рд┐рд╕ рд╣реЛ рдЧрдИред ; (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ PHPStan рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ-рдпрд╣
рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдХрднреА-рдХрднреА рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, PHPStan рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ:
- рдпрджрд┐ рдЖрдкрдХреЛ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ PHPStan, Phan рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рддреЗрдЬ рдФрд░ Psalm рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ (20-50%) рддреЗрдЬ рд╣реИред
- PHPStan рд░рд┐рдкреЛрд░реНрдЯ рдЕрдиреНрдп рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ
false-positive
рдЦреЛрдЬ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ fatal
рд╣реИ, рддреЛ рдпрд╣ рд╕рднреА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ (рдпрд╛ рддреАрди рдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рджреЛ) рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдкрдбреЗрдЯ:PHPStan Ond┼Щej Mirtes рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рднреА рд╣рдорд╛рд░реЗ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рд╛ рдФрд░ рд╣рдореЗрдВ
рдмрддрд╛рдпрд╛ рдХрд┐ рднрдЬрди рдХреА рддрд░рд╣ PhStStan рдореЗрдВ рдПрдХ "рд╕реИрдВрдбрдмреЙрдХреНрд╕":
https://phpstan.org/ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реИред рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ: рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧрд┐рдЯрд╣рдм рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рджреЗрддреЗ рд╣реИрдВред
рдлрд╝рд╛рди
Etsy рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рддред рдкрд╣рд▓реА рдмрд╛рд░ рд░рд╛рд╕рдорд╕ рд▓реЗрд░рдбреЛрд░реНрдл рд╕реЗ
рддреАрди рдореЗрдВ рд╕реЗ рдкреНрд░рд╢реНрди, рдлрд╛рди рдПрдХрдорд╛рддреНрд░
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реИ (рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЖрдкрдХреЗ
рд╕рдВрдкреВрд░реНрдг рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЬреЛ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ)ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ 6 рдЬреАрдмреА рд░реИрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд╛рд░ рд╕реЗ рдкрд╛рдВрдЪ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдкреВрд░реЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХрд╛ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд▓рдЧрднрдЧ рдЫрд╣ рд╕реЗ рд╕рд╛рдд рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рднрдЬрди рдиреЗ рдХреБрдЫ рджрд╕рд┐рдпреЛрдВ рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ред рдФрд░ PHPStan рд╕реЗ рд╣рдо рдкреВрд░реЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХрд╛ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдереЗ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдлрд╛рди рдЕрдиреБрднрд╡ рджреБрдЧреБрдирд╛ рд╣реИред рдПрдХ рддрд░рдл, рдпрд╣ рд╕рдмрд╕реЗ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓рд╛ рдФрд░ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрдо рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬрдм рдкреВрд░реЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЗрд╕рдореЗрдВ рджреЛ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред
рд╣реБрдб рдХреЗ рддрд╣рдд, рдлрди php-ast рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреВрд░реЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЬрд▓реНрджреА рд╣реИред рд▓реЗрдХрд┐рди php-ast рдПрдПрд╕рдЯреА рдЯреНрд░реА рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ PHP рдореЗрдВ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдФрд░ PHP рдореЗрдВ рд╣реА, рдПрдПрд╕рдЯреА рдЯреНрд░реА рдореЗрдВ рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рдпрджрд┐ рдЖрдкрдиреЗ рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦрд╛ рд╣реИ:
function doSomething($type) { $obj = MyFactory::createObjectByType($type); тАж }
рдПрдПрд╕рдЯреА рдкреЗрдбрд╝ рдХреЗ рдЕрдВрджрд░
doSomething()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА
doSomething()
рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ PHPDoc рд╕рд╣рд╛рдпрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдлрд╛рди рднреА рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдпрд╣ рдлрд╝рд╛рди рдореЗрдВ
false-positive
рдХрд╛ рд╕рдмрд╕реЗ рдЖрдо рдХрд╛рд░рдг рд╣реИред рдЯреВрд▓рдЯрд┐рдкреНрд╕ (рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдпрд╛ рдПрд╕рд░-рдПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдХреБрдЫ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВред рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдордиреЗ рдлрд╝рд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рджреВрд╕рд░реА рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдлрд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
class A { private $a; public function __construct(string $a = null) { $this->a = $a; } public function doSomething() { if ($this->a && strpos($this->a, 'a') === 0) { var_dump("test1"); } } }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлрд╛рди рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рд╕реНрдЯреНрд░реИрдк рдореЗрдВ рдЖрдк рдЕрд╢рдХреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдФрд░ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ:
https://github.com/phan/phan/issues/204рд╕рд╛рд░рд╛рдВрд╢ред рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдлрд╛рди рдПрдХ рдмрд╣реБрдд рд╣реА рд╢рд╛рдВрдд рдФрд░ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдХрд╛рд╕ рд╣реИред рдЗрди рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ
false-positive
, рд╡рд╣ рд▓рдЧрднрдЧ рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рдХреЛрдб рдкрд░ред рд╣рдореЗрдВ рдпрд╣ рднреА рдкрд╕рдВрдж рдЖрдпрд╛ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдХ PHP рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ - рдпрд╣ рдХреБрдЫ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИред рдлрд╛рди рднрд╛рд╖рд╛ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ PHPStorm рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдкреНрд▓рдЧ-рдЗрди
Phan рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдкреНрд▓рдЧрдЗрди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ API рд╣реИред рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЪреЗрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд╕реБрдзрд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдПрдкреАрдЖрдИ
рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдкреНрд▓рдЧ рдЗрди рд╣реИрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рджреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рдкрд╣рд▓реЗ рдПрдХ рдмрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдерд╛ред рд╣рдо рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреЛрдб PHP 7.3 рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рддреИрдпрд╛рд░ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣
case-insensitive
рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИ)ред рд╣рдо рд▓рдЧрднрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдереЗ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдИ рдХрдореА рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди 12 рд╕рд╛рд▓ рдореЗрдВ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдФрд░ рд╣рдордиреЗ рдлрд╝рд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рдХрд┐ рд╢рдкрде рд▓реЗрдЧрд╛ рдЕрдЧрд░ рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ
define()
рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкреНрд▓рдЧрдЗрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ <?php declare(strict_types=1); use Phan\AST\ContextNode; use Phan\CodeBase; use Phan\Language\Context; use Phan\Language\Element\Func; use Phan\PluginV2; use Phan\PluginV2\AnalyzeFunctionCallCapability; use ast\Node; class DefineThirdParamTrue extends PluginV2 implements AnalyzeFunctionCallCapability { public function getAnalyzeFunctionCallClosures(CodeBase $code_base) : array { $define_callback = function ( CodeBase $code_base, Context $context, Func $function, array $args ) { if (\count($args) < 3) { return; } $this->emitIssue( $code_base, $context, 'PhanDefineCaseInsensitiv', 'Define with 3 arguments', [] ); }; return [ 'define' => $define_callback, ]; } } return new DefineThirdParamTrue();
рдлрд╝рд╛рди рдореЗрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдирд╛рдУрдВ рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкрд╛рд░реНрд╕ рд╣реЛрдиреЗ рдкрд░
AnalyzeFunctionCallCapability
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЪрд╛рд▓реВ рд╣реЛ
AnalyzeFunctionCallCapability
ред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдореЗрдВ, рд╣рдордиреЗ рдЗрд╕реЗ рдЗрд╕рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо
define()
рдлрд╝рдВрдХреНрд╢рди
define()
рдХреЙрд▓ рдХрд░рддреЗ
define()
, рддреЛ рд╣рдорд╛рд░рд╛ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд▓рд╛рддрд╛ рд╣реИ, рдЬреЛ
define()
рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪреЗрдХ
define()
рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВред рдлрд┐рд░ рд╣рдордиреЗ рдмрд╕ рдлрд╝реИрди рд╢реБрд░реВ рдХрд┐рдпрд╛, рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ
define()
рдЬрд╣рд╛рдВ
define()
рддреАрди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
case-insensitive-
ред
рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ Phan рдХреЛ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ PHPDoc рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджреЗрдЦрдиреЗ рдкрд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ
false-positive
рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рджреАред
рд╣рдо рдЕрдХреНрд╕рд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рдЕрдХреНрд╕рд░ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
$Object = \Objects\Factory::create(\Objects\Config::MY_CONTROLLER);
рдлрд╝рд╛рди рдХреЛ рдРрд╕реЗ PHPDoc рд╕рдВрдХреЗрдд рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХреЛрдб рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рдирд┐рд░рдВрддрд░ рдкрд╛рд╕ рдХреЗ рдирд╛рдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
create()
рд╡рд┐рдзрд┐ред рдлрд╝рд╛рди рдЖрдкрдХреЛ рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЖрдЧ рд▓рдЧ рдЬрд╛рддреА рд╣реИред рдФрд░ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде, рдЖрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХреЙрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред
рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди
vendor/phan/phan/src/Phan/Plugin/Internal/DependentReturnTypeOverridePlugin.php.
рдореЗрдВ Phan рдХреЛрдб рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ
vendor/phan/phan/src/Phan/Plugin/Internal/DependentReturnTypeOverridePlugin.php.
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдо рдлрд╛рди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реЗ рдмрд╣реБрдд рдкреНрд░рд╕рдиреНрди рд╣реИрдВред рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП
false-positive
рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ (рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рд░рд▓ рдХреЛрдб рдХреЗ рд╕рд╛рде) рд╕реАрдЦрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдлрд╛рди рдПрдХ рд▓рдЧрднрдЧ рд╕рдВрджрд░реНрдн рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдмрди рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреВрд░реЗ рдХреЛрдб рдмреЗрд╕ (рд╕рдордп рдФрд░ рдмрд╣реБрдд рд╕реА рдореЗрдореЛрд░реА) рдХреЛ рддреБрд░рдВрдд рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрднреА рднреА рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИред
рднрдЬрди
рд╕реНрддреЛрддреНрд░ Vimeo рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рдХрд╛рд╕ рд╣реИред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЬрдм рддрдХ рдореИрдВрдиреЗ рд╕реНрддреЛрддреНрд░ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛, рддрдм рддрдХ рд╡реАрдореЛ PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣рдорд╛рд░реЗ рддреАрдиреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдЦрдмрд░ рдкрдврд╝реА рдХрд┐ рд╡реАрдореЛ рдиреЗ рднрдЬрди рдХреЛ рдЬрд╛рд░реА рдХрд┐рдпрд╛, рддреЛ рдореИрдВ рдПрдХ рдиреБрдХрд╕рд╛рди рдореЗрдВ рдерд╛: "рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╝рд╛рди рдФрд░ PHPStan рд╣реИ рддреЛ рднрдЬрди рдореЗрдВ рдирд┐рд╡реЗрд╢ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?" рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рднрдЬрди рдХреА рдЕрдкрдиреА рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред
рднрдЬрди рдиреЗ PHPStan рдХреЗ рдирдХреНрд╢реЗрдХрджрдо рдкрд░ рдЪрд▓рддреЗ рд╣реБрдП: рдЖрдк рдЗрд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛ рдЬреЛ рдСрдЯреЛ-рд▓реЛрдб рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдпрд╣
рдХреЗрд╡рд▓ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдирд╣реАрдВ рдкрд╛рдП рдЧрдП рдереЗ, рдФрд░ рдЬрд┐рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдордиреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдерд╛, рд╡реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ (рдпрд╣ PHPStan рд╕реЗ рдЕрд▓рдЧ рд╣реИ)ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдПрдХ XML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ (рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдЛрдг рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ)ред
Psalm рдореЗрдВ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╡рд╛рд▓реА
рд╕рд╛рдЗрдЯ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк PHP рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ: рдЖрдк рд╕рд╛рдЗрдЯ рдкрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧрд┐рдЯрд╣рдм рдореЗрдВ рд▓рд┐рдВрдХ рджреЗрддреЗ рд╣реИрдВред рдФрд░ рд╡реИрд╕реЗ, рд╕рд╛рдЗрдЯ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП: PHPStan рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ Phan рдореЗрдВ рд╡реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдПрдХрд▓ рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред
рд╣рдореЗрдВ рдпрд╣ рднреА рдкрд╕рдВрдж рдЖрдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╕рдордп, рднрдЬрди рддреБрд░рдВрдд рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡реЗ рдкрд╛рдП рдЧрдП рдереЗред рдпрд╣ рдкрдврд╝рдиреЗ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ
рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рднрдЬрди рдХреА рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕рдХреЗ рдХрд╕реНрдЯрдо PHPDoc рдЯреИрдЧ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛)ред рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕реВрдЪреА рджреЗрддреЗ рд╣реИрдВред
@ рд╕реНрддреЛрддреНрд░-рдЙрдкреЗрдХреНрд╖рд╛-рдЕрд╢рдХреНрдд-рд╡рд╛рдкрд╕реА
рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐
null
, рд▓реЗрдХрд┐рди рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рдЖрдк рд╡рд┐рдзрд┐ / рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ PHPDoc рд╕рдВрдХреЗрдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рднрдЬрди рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛ рдХрд┐
null
рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИред
рдПрдХ рд╕рдорд╛рди рд╕рдВрдХреЗрдд рдЭреВрда рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ:
@psalm-ignore-falsable-return
ред
рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░
рдпрджрд┐ рдЖрдк рдХрднреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИред PHP рдореЗрдВ, рдпрд╣ рд╢реИрд▓реА рдЖрдкрдХреЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ PHP рдореЗрдВ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХреЗ рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
function my_filter(array $ar, \Closure $func) { тАж }
рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╣ рдХреИрд╕реЗ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреМрди рд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ? рдЗрд╕реЗ рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЙрд╕реЗ рдХреНрдпрд╛ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП?
рднрдЬрди PHPDoc рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:
function my_filter(array $ar, \Closure $func) { тАж }
рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ
my_filter
рдХреЛ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдПрдХ рдЗрдВрдЯ рдФрд░ рд░рд┐рдЯрд░реНрди рдмреВрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рднрдЬрди рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИред
enums
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдХреЗрд╡рд▓ рд╡рд╣рд╛рдВ рдХреБрдЫ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
function isYes(string $yes_or_no) : bool { $yes_or_no = strtolower($yes_or_no) switch($yes_or_no) { case 'yes': return true; case 'no': return false; default: throw new \InvalidArgumentException(тАж); } }
рднрдЬрди рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
function isYes(string $yes_or_no) : bool { тАж }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рднрдЬрди рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдпрджрд┐
Yes
рдФрд░
No
рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдорд╛рди рд╣реИрдВ, рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрдВ
No
рдПрдирдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВред
рдЙрдкрдирд╛рдо рд▓рд┐рдЦреЗрдВ
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ
array shapes
рдХреЗ рд╡рд░реНрдгрди рдореЗрдВ
array shapes
рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рдпрджреНрдпрдкрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдкрдХреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░рдгреА рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ, рд╕рд╣реА рд╕рдорд╛рдзрд╛рди, рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
, , , :
- ;
- closure;
- union- (, );
- enum.
, , PHPDoc , , . Psalm . alias PHPDoc
alias
. , : PHP-. . , Psalm.
Generics aka templates
. , :
function identity($x) { return $x; }
? ? ?
, , , тАФ
mixed
, .
mixed
тАФ . , . ,
identity()
/ , : , . -. , :
$i = 5;
(int)
, ,
$y
(
int
).
? Psalm PHPDoc-:
function identity($x) { $return $x; }
templates Psalm , / .
Psalm templates:
тАФ
vendor/vimeo/psalm/src/Psalm/Stubs/CoreGenericFunctions.php ;
тАФ
vendor/vimeo/psalm/src/Psalm/Stubs/CoreGenericClasses.php .
Phan, :
https://github.com/phan/phan/wiki/Generic-Types .
, Psalm . , ┬л┬╗ . , Psalm , , Phan PHPStan. .
PHPStorm
: , . , , .
. Phan, language server. PHPStorm, , .
, , PHPStorm ( ), . тАФ Php Inspections (EA Extended). тАФ , , . , . , scopes - scopes.
,
deep-assoc-completion . .
Badoo
?
, .
, . , ,
git diff
/ , , () . , .
, : -
git diff
. . , . . , , , , .
, , :

false-positive
. , , Phan , , . , - Phan , , .
QA
:
тАФ , , , . :
- 100% ( , );
- , code review;
- , .
strict types
. ,
strict types
, :
- ,
strict types
, ;
- , (, , );
- , PHP (,
union types
, PHP);
strict types
, .
:
, . .
-, , , - , .
-, , тАФ , , PHPDoc. тАФ .
-, . , - , PHPDoc. :)
, , . , .