Php 5.4 рдореЗрдВ рд▓рдХреНрд╖рдгред рдкрд╛рд░реНрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг

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

рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдирд╣реАрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрджрд╛рд╣рд░рдг:
//  trait Pprint { public function whoAmI() { return get_class($this) . ': ' . (string) $this; } } class Human { use Pprint; // ,   use protected $_name = 'unknown'; public function __construct($name) { $this->_name = $name; } public function __toString() { return (string) $this->_name; } } $a = new Human('Nikita'); echo $a->whoAmI(), PHP_EOL; //=> Human: Nikita 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, Pprint type рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ Human рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рд░ рдЪреАрдЬ рдХрд╛ рдЕрдкрдирд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред

рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдЕрд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓рдХреНрд╖рдг рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ use рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред use рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрд╣реАрдВ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, use рдмрд╛рдж рдмреНрд▓реЙрдХ ( {...} ) рдореЗрдВ use рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдкреНрд░рдХрд╛рд░ рдЦреБрдж рдХреЛ trait рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ trait рдФрд░ use рдХреАрд╡рд░реНрдб рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдХреНрд╖рдорддрд╛рдПрдВ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ use рд╕рдорд╛рди рд╣реИрдВред

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг:
 trait Pprint { public function whoAmI() { return get_class($this) . ': ' . (string) $this; } } trait Namer { //     use Pprint; public function getMyName() { return $this->whoAmI(); } public function getMyLastName() { return 'Unknown =('; } public function getMyNickname() { return preg_replace('/[^az]+/i', '_', strtolower($this->getMyName())); } } trait SuperNamer { public function getMyLastName() { return 'Ask me'; } } class Human { use SuperNamer; use Namer { SuperNamer::getMyLastName insteadof Namer; Namer::getMyNickname as protected _getMyLogin; } protected $_name = 'unknown'; public function __construct($name) { $this->_name = $name; } public function __toString() { return (string) $this->_name; } public function getLogin() { return $this->_getMyLogin(); } } $a = new Human('Nikita'); echo join(', ', get_class_methods($a)), PHP_EOL; //__construct, __toString, getLogin, getMyLastName, //getMyName, getMyNickname, whoAmI echo $a->getMyName(), PHP_EOL; //Human: Nikita echo $a->getMyLastName(), PHP_EOL; //Ask me echo $a->getLogin(), PHP_EOL; //human_nikita echo $a->getMyNickname(), PHP_EOL; //human_nikita 

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

рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕рднреА рд▓рдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдкрд░, рдирд┐рдпрдореЛрдВ рдФрд░ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛ рдЗрд╕рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВред рдЪреБрдирд╛рд╡ рдЖрдкрдХрд╛ рд╣реИред
 // use SuperNamer, Namer, Singleton, SomeOther { SuperNamer::getMyLastName insteadof Namer; SomeOther::getSomething as private; } //  use Namer; use Singleton; use SuperNamer { SuperNamer::getMyLastName insteadof Namer; } use SomeOther { SomeOther::getSomething as private; } 

рджреВрд╕рд░реЗ, рддрд░реАрдХреЛрдВ рдХреА рд╕реВрдЪреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, 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; //... public function getId() { return $this->_WithId_id; } public function setId($id) { $this->_WithId_id = $id; } } 

рдХреНрд╖реЗрддреНрд░


рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рднреАрддрд░ рд╡рд┐рднрд┐рдиреНрди рдХреЙрд▓ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд▓рдХреНрд╖реНрдп рд╡рд░реНрдЧ рдореЗрдВ "рдХреЙрдкреА-рдкреЗрд╕реНрдЯ" рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ рд╢рд╛рд╕рди рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рджреБрднрд╛рд╖рд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рдХреНрд░рдорд╢рдГ 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; } //Fatal error: Trait method abc has not been applied, //because there are collisions with other trait methods //on C in %FILE% on line %line% 
insteadof рд▓рд┐рдП рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рд╕рднреА рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред

рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЯрдХрд░рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рднреА рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ php рдЗрд╕ рдЪреЗрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХреЗрд╡рд▓ "рдЬреАрд╡рд┐рдд" рдЧреБрдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ:
 trait A { public function abc() {} } trait B { public function abc() {} } class C { use A, B; public function abc() {} } //OK 
рдХреБрдЫ рд╕рдордп рдмрд╛рдж, abc рд╡рд┐рдзрд┐ рдХреЛ рдореВрд▓ рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЯрдХреНрдХрд░ рдореЗрдВ рдПрдХ рдЕрдЬреАрдм рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддреА рд╣реИред рддреЛ рдЯрдХреНрдХрд░реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ( рджреВрд╕рд░реА рддрд░рдл, рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдХреБрдЫ рдЧрд▓рдд рд╣реИред )

рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ рд╢реНрд░реЗрдгреА рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЧреБрдг рдорд┐рд▓рд╛рди рдХрд░реЗрдВ


рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЕрдкреНрд░рд┐рдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред рддреБрд░рдВрдд рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 trait WithId { protected $_id = false; //protected $_var = 'a'; public function getId() { return $this->_id; } //... } trait WithId2 { protected $_id = null; //protected $_var = null; //... } class A { use WithId, WithId2; } class B { use WithId2, WithId; } class C { use WithId; protected $_id = '0'; } // $a = new A(); var_dump($a->getId()); //NULL $b = new B(); var_dump($b->getId()); //false $c = new C(); var_dump($c->getId()); //false (!) //  $_var // WithId and WithId2 define the same property ($_var) // in the composition of A. However, the definition differs // and is considered incompatible. Class was composed // in %FILE% on line %LINE% 

рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрдкрдиреЗ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддреЗ рд╕рдордп, рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП "рд╕рдВрдЧрдд" рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡реЗ "рдЬреЛ рдЕрдВрддрд┐рдо рд╣реИ, рд╡рд╣ рд╕рд╣реА рд╣реИ" рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрдХреНрд╖рд╛ A , getId NULL рдирд┐рдХрд▓рд╛, рдФрд░ рдХрдХреНрд╖рд╛ B , рдпрд╣ рдЧрд▓рдд рдирд┐рдХрд▓рд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдХрдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рд╡рд┐рдкрд░реАрдд рд╣реИ) рдФрд░ C рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд '0' рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЧрд▓рдд рд╣реИрдВред

рдЬрд┐рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ рдЧреИрд░-рд╕рдЦреНрдд рддреБрд▓рдирд╛рдПрдБ рд╣реИрдВ, рдЬреЛ рд╕рдЪ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдЪреВрдВрдХрд┐ php рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд░реВрдкрд╛рдВрддрд░рдг рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд▓реМрдЯреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдХрдбрд╝рд╛рдИ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдкрд░ рдЕрдкреНрд░рд┐рдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
 var_dump(null == false); //true var_dump('0' == false); //true var_dump('a' == null); //false 

рддреЛ рдКрдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЕрднреНрдпрд╛рд╕ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рдЕрдкрд╡рд╛рдж


рдпрджрд┐ рдЖрдк mnemonic rule trait == "рдХреЙрдкреА-рдкреЗрд╕реНрдЯ" рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
 <?php trait Slug { public function error() { echo $this->a; //5 } public function someMethod() { $this->error(); } public function testExc() { throw new Exception('Test'); //16 } } class Brain { use Slug; public function plurk() { $this->testExc(); //25 } } error_reporting(E_ALL); $b = new Brain(); $b->someMethod(); //Notice: Undefined property: Brain::$a in %FILE% on line 5 try { $b->plurk(); //35 } catch(Exception $e) { echo $e; } // exception 'Exception' with message 'Test' in %FILE%:16 // Stack trace: // #0 %FILE%(25): Brain->testExc() // #1 %FILE%(35): Brain->plurk() // #2 {main} 

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

рд╕рдлреЗрдж рдХрд╛рд▓реЗ рдЬрд╛рджреВ рдХрд╛ рдПрдХ рд╕рд╛


рдореИрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрдВрджреЗ рдЪрд╛рд▓реЗрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдФрд░ рдЬреЛрдЦрд┐рдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд┐рдзрд┐ рдирд┐рдХрд╛рд▓рдирд╛


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдпрд╣ рдЙрд░реНрдл тАЛтАЛрджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 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; //a, c, d 

рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдПрдХ рдмрдбрд╝рд╛ рдЦрддрд░рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 $c = new C(); $c->d(); //Fatal error: Call to undefined method C::e() 

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

"рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕" рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ


рдПрдХ рд╕рдорд╛рди рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк "рдореВрд▓" рддрд░реАрдХреЛрдВ рдХреЛ "рдореВрд▓" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде "рд╡рд┐рд░рд╛рд╕рдд" рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 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(); //  static:: if (!Storage::hasInstance($class)) { $new = new static(); Storage::setInstance($class, $new); } return Storage::getInstance($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; //MyClass echo get_class(MyExtClass::getInstance()), PHP_EOL; //MyExtClass 


рдкреБрдирд╢реНрдЪ

рд▓рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдорджрдж рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж aveic ред

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


All Articles