рд╕рдмрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ
, рдкрд╣рд▓рд╛ рдмреАрдЯрд╛ php 5.4 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдФрд░ рдЬрдм рдореИрдВ рд╡рд┐рд╖рдп рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛
, рджреВрд╕рд░рд╛ рд╕рдордп рдореЗрдВ рдЖ рдЧрдпрд╛ ред 5.4 рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд▓рдХреНрд╖рдг рд╣реИред рдореИрдВ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ php рдореЗрдВ рдХреНрдпрд╛ рд▓рдХреНрд╖рдг рд╣реИрдВред
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдирд╣реАрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓
рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрджрд╛рд╣рд░рдг:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ,
Pprint
type рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░
Human
рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рд░ рдЪреАрдЬ рдХрд╛ рдЕрдкрдирд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред
рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдЕрд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓рдХреНрд╖рдг рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ
use
рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
use
рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрд╣реАрдВ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд,
use
рдмрд╛рдж рдмреНрд▓реЙрдХ (
{...}
) рдореЗрдВ
use
рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ (
Trait::method as myMethod
- Trait рд╕реЗ method
рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреА, рдЬреИрд╕реЗ myMethod
); - рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдУрд╡рд░рд▓реИрдк рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рджреВрд╕рд░реЗ рдХреА рд╡рд┐рдзрд┐, рдпрджрд┐ рдЙрдирдХрд╛ рдПрдХ рд╣реА рдирд╛рдо рд╣реИ (
TraitA::method insteadof TraitB
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп TraitA::method insteadof TraitB
- TraitA
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕реА рдирд╛рдо рдХреА TraitB
рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛); - рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рд╕реЗ рд╕реНрдереИрддрд┐рдХ рддрдХ рдкрд╣реБрдБрдЪ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рдШрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдереИрддрд┐рдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде (
Trait::publicMethod as protected
), рдЖрдк рддреБрд░рдВрдд рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ ( Trait::publicMethod as protected _myProtectedMethod
)ред
рдкреНрд░рдХрд╛рд░ рдЦреБрдж рдХреЛ
trait
рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛
trait
рдФрд░
use
рдХреАрд╡рд░реНрдб рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдХреНрд╖рдорддрд╛рдПрдВ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ
use
рд╕рдорд╛рди рд╣реИрдВред
рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг:
trait Pprint { public function whoAmI() { return get_class($this) . ': ' . (string) $this; } } trait Namer {
рджреЛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЬрд░реВрд░реА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
use
рдмрд╛рдж рдмреНрд▓реЙрдХ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реИред рдмреНрд▓реЙрдХ рдХреЗ рдирд┐рдпрдо рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рдХрд╣реАрдВ рднреА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕рднреА рд▓рдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдкрд░, рдирд┐рдпрдореЛрдВ рдФрд░ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛ рдЗрд╕рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВред рдЪреБрдирд╛рд╡ рдЖрдкрдХрд╛ рд╣реИред
рджреВрд╕рд░реЗ, рддрд░реАрдХреЛрдВ рдХреА рд╕реВрдЪреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ,
getMyNickname
рд╕реВрдЪреА рдореЗрдВ рдмрдиреА рд╣реБрдИ рд╣реИ, рдФрд░
_getMyLogin
рдХрдо рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдЗрд╕рдХрд╛ рдЙрдкрдирд╛рдо рд╣реИред рдЖрдк рдореВрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЬрд╛рджреВ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХред
рд▓рдХреНрд╖рдг рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддрд░рд╣ рдЧрддрд┐рд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВред рддреАрд╡реНрд░ рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
if ($isWin) { trait A { } } else { trait A { } }
рдЧреБрдг рдЧреБрдг
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╡реЗ рдЧреБрдг рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, php рдореЗрдВ "рд▓рдХреНрд╖рдг" рдорд┐рдХреНрд╕рд┐рди рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╣реИрдВред
trait WithId { protected $_id = null; public function getId() { return $this->_id; } public function setId($id) { $this->_id = $id; } }
рддреБрд░рдВрдд рдореИрдВ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдПрдХ рджрд┐рди рдпрд╣ рдкрддрд╛ рди рдЪрд▓реЗ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрдВ
_id
рд╕рдВрдкрддреНрддрд┐ рдЙрд╕ рд╡рд░реНрдЧ рдпрд╛ рдЙрд╕рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЗ рд╕рд╛рде, рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ:
trait WithId { protected $_WithId_id = null; protected $_WithId_checked = false;
рдХреНрд╖реЗрддреНрд░
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рднреАрддрд░ рд╡рд┐рднрд┐рдиреНрди рдХреЙрд▓ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд▓рдХреНрд╖реНрдп рд╡рд░реНрдЧ рдореЗрдВ "рдХреЙрдкреА-рдкреЗрд╕реНрдЯ" рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ рд╢рд╛рд╕рди рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рджреБрднрд╛рд╖рд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рдХреНрд░рдорд╢рдГ
Human
рд╡рд░реНрдЧ рдореЗрдВ
whoAmI
рдкрджреНрдзрддрд┐ рдХрд╛ "рдХреЙрдкреА-рдкреЗрд╕реНрдЯ" рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рд╕рднреА
parent
рдХреЛ рдХреЙрд▓,
self
,
$this
рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдХреЙрд▓ рднреАред рдПрдХ рдЕрдкрд╡рд╛рдж рдХреБрдЫ рдореИрдЬрд┐рдХ
whoAmI
рд╣реЛрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
whoAmI
__METHOD__ === 'Pprint :: whoAmI' рдХреЗ рдЕрдВрджрд░ред
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдХреЛрдк рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреЗрд╡рд▓
__toString
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп
$this->_name
рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рд╕рдордп рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдпрд╣ рдХрд╛рдлреА рднреНрд░рдо рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рднреА рд╡рд░реНрдгрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ "рдордЬрдмреВрд░" рдХрд░реЗрдВред
рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЗ рдФрд░ рдЧреБрдг
рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди
рдЖрдк рд╕реНрдереИрддрд┐рдХ рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛
рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ ред рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░, рдЖрдк рд╕реНрдереИрддрд┐рдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рд╕реНрд╡: :) рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рд╕реНрдерд┐рд░: :), рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ ("рдХреЙрдкреА-рдкреЗрд╕реНрдЯ") рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЬрд╛рджреВ рдХреА рдЕрдкреАрд▓ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдЕрдкрдиреЗ рдЖрдк рдХреЗ рд╕рд╛рде рдФрд░ рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдпреЛрдЧ
рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреБрдЫ рд╡рд┐рдзрд┐ рдХреЛ рдкреИрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ
рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдЧрд╛ (рдлрд┐рд░ рд╕реЗ, "рдХреЙрдкреА-рдкреЗрд╕реНрдЯ" рдпрд╛рдж рд░рдЦреЗрдВ)ред
рдпрджрд┐ рдХрдХреНрд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ php рдХрдХреНрд╖рд╛ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рд╕реНрддрд░ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛:
trait A { public function abc() {} } trait B { public function abc() {} } class C { use A, B; }
insteadof
рд▓рд┐рдП рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рд╕рднреА рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред
рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЯрдХрд░рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рднреА рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ php рдЗрд╕ рдЪреЗрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХреЗрд╡рд▓ "рдЬреАрд╡рд┐рдд" рдЧреБрдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ:
trait A { public function abc() {} } trait B { public function abc() {} } class C { use A, B; public function abc() {} }
рдХреБрдЫ рд╕рдордп рдмрд╛рдж,
abc
рд╡рд┐рдзрд┐ рдХреЛ рдореВрд▓ рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЯрдХреНрдХрд░ рдореЗрдВ рдПрдХ рдЕрдЬреАрдм рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддреА рд╣реИред рддреЛ рдЯрдХреНрдХрд░реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (
рджреВрд╕рд░реА рддрд░рдл, рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдХреБрдЫ рдЧрд▓рдд рд╣реИред )
рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ рд╢реНрд░реЗрдгреА рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЧреБрдг рдорд┐рд▓рд╛рди рдХрд░реЗрдВ
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЕрдкреНрд░рд┐рдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред рддреБрд░рдВрдд рдПрдХ рдЙрджрд╛рд╣рд░рдг:
trait WithId { protected $_id = false;
рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрдкрдиреЗ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддреЗ рд╕рдордп, рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП "рд╕рдВрдЧрдд" рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡реЗ "рдЬреЛ рдЕрдВрддрд┐рдо рд╣реИ, рд╡рд╣ рд╕рд╣реА рд╣реИ" рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрдХреНрд╖рд╛
A
,
getId
NULL рдирд┐рдХрд▓рд╛, рдФрд░ рдХрдХреНрд╖рд╛
B
, рдпрд╣ рдЧрд▓рдд рдирд┐рдХрд▓рд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдХрдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рд╡рд┐рдкрд░реАрдд рд╣реИ) рдФрд░
C
рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд '0' рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЧрд▓рдд рд╣реИрдВред
рдЬрд┐рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ рдЧреИрд░-рд╕рдЦреНрдд рддреБрд▓рдирд╛рдПрдБ рд╣реИрдВ, рдЬреЛ рд╕рдЪ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдЪреВрдВрдХрд┐ php рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд░реВрдкрд╛рдВрддрд░рдг рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд▓реМрдЯреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдХрдбрд╝рд╛рдИ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдкрд░ рдЕрдкреНрд░рд┐рдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
var_dump(null == false);
рддреЛ рдКрдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЕрднреНрдпрд╛рд╕ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рдЕрдкрд╡рд╛рдж
рдпрджрд┐ рдЖрдк mnemonic rule trait == "рдХреЙрдкреА-рдкреЗрд╕реНрдЯ" рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
<?php trait Slug { public function error() { echo $this->a;
рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдм рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдиреЛрдЯрд┐рд╕ рдпрд╛ рдЕрдкрд╡рд╛рдж рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдореЗрдВ рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЙрд▓ рдереЗред рдпрджрд┐ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓рдХреНрд╖рдг рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рд╕рдлреЗрдж рдХрд╛рд▓реЗ рдЬрд╛рджреВ рдХрд╛ рдПрдХ рд╕рд╛
рдореИрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрдВрджреЗ рдЪрд╛рд▓реЗрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдФрд░ рдЬреЛрдЦрд┐рдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд┐рдзрд┐ рдирд┐рдХрд╛рд▓рдирд╛
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдпрд╣ рдЙрд░реНрдл тАЛтАЛрджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
trait A { public function a() {} public function b() {} } trait B { public function d() { $this->e(); } public function e() {} } class C { use A { // A::b insteadof A; A::b as c; } use B { // B::e insteadof B; } } echo join(", ", get_class_methods('C')), PHP_EOL;
рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдПрдХ рдмрдбрд╝рд╛ рдЦрддрд░рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$c = new C(); $c->d();
рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЙрдкрдирд╛рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдореВрд▓ рд╡рд┐рдзрд┐ рдмрдЪ рдЬрд╛рддреА рд╣реИред
"рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕" рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ
рдПрдХ рд╕рдорд╛рди рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк "рдореВрд▓" рддрд░реАрдХреЛрдВ рдХреЛ "рдореВрд▓" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде "рд╡рд┐рд░рд╛рд╕рдд" рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
trait Namer { public function getName() { return 'Name'; } } trait Namer2 { public function getName() { return 'Name2'; } } trait Supernamer { use Namer, Namer2 { Namer::getName insteadof Namer; Namer::getName as protected _Namer_getName_; Namer2::getName insteadof Namer2; Namer2::getName as protected _Namer2_getName_; } public function getName() { return $this->_Namer_getName_() . $this->_Namer2_getName_(); } }
рд▓рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ
рдЗрд╕ рдЬрд╛рджреБрдИ рдЖрдХреНрд░реЛрд╢ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдЕрдХреНрд╕рд░, рд╕рд┐рдВрдЧрд▓рдЯрди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдмрдирд╛рдирд╛ рдЙрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд┐рддрдирд╛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИред рдЖрдк рджреЛ рддрд░рдХреАрдмреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛ рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕реЗ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
trait Singleton { static public function getInstance() { $class = get_called_class();
рджреВрд╕рд░рд╛ рдлреАрдЪрд░ рд░реВрдЯрд┐рдВрдЧ рдлреЗрд▓реНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдПрдХ php рд░реВрдлрд┐рдВрдЧ рдмрдЧ, рдЬреЛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп
static
рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЗрди рдЪрд░реЛрдВ рдХреЛ рдЕрдкрдирд╛ рдореВрд▓реНрдп рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдЗрди рдЪрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рди рдкрд░ рд╢реБрд░реВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдпреЛрдЬрдирд╛ рд╣реИ:
trait Singleton { static public function getInstance() { static $instance = null; if ($instance === null) { $instance = new static(); } return $instance; } } class MyClass { use Singleton; } class MyExtClass extends MyClass {} echo get_class(MyClass::getInstance()), PHP_EOL;
рдкреБрдирд╢реНрдЪ
рд▓рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдорджрдж рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
aveic ред