PHP OOP တွင် Trait များ၏ Method ပဋိပက္ခများကို ဖြေရှင်းခြင်း

တစ်ခုတည်းသော class သည် trait များစွာကို အသုံးပြုနိုင်သောကြောင့်၊ trait နှစ်ခုတွင် အမည်တူ method များ ရှိနေသည့်အခါ ဖြစ်ပေါ်တတ်သော ပြဿနာနှင့် ကျွန်ုပ်တို့ ရင်ဆိုင်ရနိုင်ပါသည်။

ဤသို့သော အခြေအနေတွင် PHP သည် fatal error တစ်ခု ပြန်ပေးမည် ဖြစ်ပါသည်။ ဤအခြေအနေကို ပြင်ဆင်ရန်၊ အမည်ပဋိပက္ခအား ရှင်းလင်းစွာ ဖြေရှင်းရန် လိုအပ်ပါသည်။ ဤသို့မည်ကဲ့သို့ ပြုလုပ်ရမည်ကို လက်တွေ့တွင် ကြည့်ရှုပါမည်။

ကျွန်ုပ်တို့တွင် အမည်တူ method method ပါရှိသော trait နှစ်ခု ရှိသည်ဟု ဆိုကြပါစို့။

php<?php
  trait Trait1
  {
    private function method()
    {
      return 1;
    }
  }
  
  trait Trait2
  {
    private function method()
    {
      return 2;
    }
  }
?>

ကျွန်ုပ်တို့တွင် Test class တစ်ခုလည်း ရှိပါစေ၊ ၎င်းသည် ကျွန်ုပ်တို့၏ trait နှစ်ခုစလုံးကို အသုံးပြုပါသည်။ ကျွန်ုပ်တို့၏ class သို့ trait နှစ်ခုစလုံးကို ရိုးရှင်းစွာ ချိတ်ဆက်ပါက၊ trait များတွင် တိုက်ဆိုင်နေသော method များ ရှိနေသောကြောင့် PHP သည် error ပြန်ပေးမည် ဖြစ်ပါသည်။

php<?php
  // ဤ code သည် error ပြန်ပေးမည်!
  class Test
  {
    use Trait1, Trait2; // trait များကို ချိတ်ဆက်ခြင်း
  }
?>

ကျွန်ုပ်တို့၏ trait များ၏ အမည်ပဋိပက္ခကို ဖြေရှင်းကြပါစို့။ ဤအတွက် အထူး operator တစ်ခု ဖြစ်သော insteadof ရှိပါသည်။ ဤ operator ကို အသုံးပြု၍ trait Trait2 ၏ အလားတူ method အစား trait Trait1 ၏ method method ကို အသုံးပြုပါမည်။

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
    }
  }
  
  new Test;
?>

သင်မြင်တွေ့ရသည့်အတိုင်း၊ ဤနေရာတွင် syntax မှာ အောက်ပါအတိုင်းဖြစ်သည်- ပထမဦးစွာ trait ၏အမည်၊ ထို့နောက် colons နှစ်ခု၊ ထို့နောက် method ၏အမည်၊ ထို့နောက် ကျွန်ုပ်တို့၏ operator insteadof နှင့် ဒုတိယ trait ၏အမည်။

စစ်ဆေးကြည့်ကြပါစို့။

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
    }
    
    public function __construct()
    {
      echo $this->method(); // 1 ကို ပြသမည်၊ အဘယ့်ကြောင့်ဆိုသော် ၎င်းသည် ပထမ trait ၏ method ဖြစ်သည်
    }
  }
  
  new Test;
?>

ထို့ကြောင့်၊ ကျွန်ုပ်တို့၏ class ထဲတွင် ကျွန်ုပ်တို့ပြောခဲ့သည်မှာ method method ကို အသုံးပြုပါက၊ ၎င်းကို ပထမ trait မှ ယူသင့်သည်။ ပြောင်းပြန်လည်း ပြုလုပ်နိုင်သည် - ဒုတိယ trait ၏ method ကို ယူပါ။

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait2::method insteadof Trait1;
    }
    
    public function __construct()
    {
      echo $this->method(); // 2 ကို ပြသမည်၊ အဘယ့်ကြောင့်ဆိုသော် ၎င်းသည် ဒုတိယ trait ၏ method ဖြစ်သည်
    }
  }
  
  new Test;
?>

မည်သို့ပင်ဆိုစေ၊ ကျွန်ုပ်တို့သည် trait တစ်ခု၏ method ကို အသုံးပြုရန် ညွှန်ကြားပါက၊ ဒုတိယ trait ၏ method သည် မရနိုင်တော့ပေ။ Keyword as ဖြင့် ၎င်း၏အမည်ကို ပြောင်းလဲကာ ဒုတိယ trait ၏ method ကိုလည်း အသုံးပြုနိုင်ပါသည်၊ ဤကဲ့သို့ဖြစ်သည်။

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method() + $this->method2(); // 3 ကို ပြသမည်
    }
  }
  
  new Test;
?>

လိုလျှင် ပထမ trait ၏ method ၏အမည်ကိုလည်း ပြောင်းလဲနိုင်ပါသည်။

php<?php
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method insteadof Trait2;
      Trait1::method as method1;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method1() + $this->method2(); // 3 ကို ပြသမည်
    }
  }
  
  new Test;
?>

insteadof ဖြင့် အဓိက method ကို သတ်မှတ်ခြင်းမရှိဘဲ keyword as ကို အသုံးပြုခြင်းသည် ခွင့်မပြုပါ၊ ၎င်းသည် error ပြန်ပေးမည်ဖြစ်သည်။

php<?php
  // ဤ class သည် error ပြန်ပေးမည်။
  class Test
  {
    use Trait1, Trait2 {
      Trait1::method as method1;
      Trait2::method as method2;
    }
    
    public function __construct()
    {
      echo $this->method1() + $this->method2();
    }
  }
  
  new Test;
?>
Задание 1

Trait1, Trait2 နှင့် Trait3 ဟုခေါ်သော trait ပေါင်း 3 ခု ပြုလုပ်ပါ။ ပထမ trait တွင် 1 ကို ပြန်ပေးသော method method ပါရှိပါစေ၊ ဒုတိယ trait တွင် 2 ကို ပြန်ပေးသော အမည်တူ method ပါရှိပါစေ၊ တတိယ trait တွင် 3 ကို ပြန်ပေးသော အမည်တူ method ပါရှိပါစေ။

Задание 2

trait သုံးခုစလုံးကို အသုံးပြုသော Test class တစ်ခုကို ပြုလုပ်ပါ။ ဤ class ထဲတွင် ချိတ်ဆက်ထားသော trait များ၏ method များ၏ ရလဒ်များ၏ ပေါင်းလဒ်ကို ပြန်ပေးသော method getSum တစ်ခုကို ပြုလုပ်ပါ။