Middle
რა უნდა გავაკეთოთ, თუ ორი trait-ს აქვს ერთნაირი სახელის მეთოდი?
sobes.tech AI
პასუხი AI-სგან
کله چې د میتودونو نومونه په traits کې ټکر وکړي، د حل لپاره څو لارې شتون لري:
-
insteadofپیشوند عملیاتګر: دا اجازه ورکوي چې د مشخص شوي trait څخه میتود وټاکئ، چې د بل trait څخه د ورته نوم میتود له پامه غورځوي.<?php trait TraitA { public function doSomething() { echo "له TraitA"; } } trait TraitB { public function doSomething() { echo "له TraitB"; } } class MyClass { use TraitA, TraitB { TraitA::doSomething insteadof TraitB; // د TraitA میتود کاروو } } $obj = new MyClass(); $obj->doSomething(); // "له TraitA" چاپ کويکولی شئ څو استثناوې هم وټاکئ:
<?php trait TraitA { public function methodA() { echo "A_a"; } public function methodB() { echo "A_b"; } } trait TraitB { public function methodA() { echo "B_a"; } public function methodB() { echo "B_b"; } } class MyClass { use TraitA, TraitB { TraitA::methodA insteadof TraitB; TraitB::methodB insteadof TraitA; } } -
asپیشوند عملیاتګر: دا اجازه ورکوي چې د ټکر لرونکي میتود یو نوم بدل کړئ:<?php trait TraitA { public function doSomething() { echo "له TraitA"; } } trait TraitB { public function doSomething() { echo "له TraitB"; } } class MyClass { use TraitA, TraitB { TraitB::doSomething as doSomethingFromB; // د TraitB میتود نوم بدلول } public function callBoth() { $this->doSomething(); // د TraitA میتود غږوي $this->doSomethingFromB(); // د بدل شوي میتود غږول } } $obj = new MyClass(); $obj->callBoth(); // "له TraitAله TraitB" چاپ کويد
asعملیاتګر دinsteadofسره په ګډه کارول کیدی شي او د میتود لیدتیا بدلوي:<?php trait TraitA { private function internalMethod() { echo "د TraitA شخصي میتود"; } } class MyClass { use TraitA { internalMethod as public externalMethod; // بدلول او عام کول } } $obj = new MyClass(); $obj->externalMethod(); // "د TraitA شخصي میتود" چاپ کوي -
په کلاس کې واضح تعریف شوی میتود: که کلاس چې traits کاروي، په صراحت سره د همدې نوم میتود تعریف کړي، دا میتود د traits میتودونو پر ځای ترجیح لري:
<?php trait TraitA { public function doSomething() { echo "له TraitA"; } } trait TraitB { public function doSomething() { echo "له TraitB"; } } class MyClass { use TraitA, TraitB; public function doSomething() { // د کلاس خپل میتود echo "له MyClass"; } } $obj = new MyClass(); $obj->doSomething(); // "له MyClass" چاپ کوي
بې له دې چې د insteadof یا as کارولو سره حل شي، یا د میتود بیا تعریفولو سره، PHP به تېروتنه E_STRICT وښيي کله چې د traits د متضاد میتودونو سره کلاس کارول هڅه وشي.