PHP တွင် OOIP အင်တာဖေ့စ်များအသုံးပြုခြင်း

ထို့ကြောင့် အင်တာဖေ့စ်များသည် လိုအပ်သော class methods အားလုံး အကောင်အထည်ဖော်ထားကြောင်းကို ထိန်းချုပ်ရန် ကောင်းသောနည်းလမ်းတစ်ခုဖြစ်ကြောင်း ကျွန်ုပ်တို့ သိရှိပြီးဖြစ်သည်။

နောက်ထပ် လက်တွေ့ကျသော ဥပမာတစ်ခုကို ကြည့်ရှုကြပါစို့။ ကျွန်ုပ်တို့တွင် အရာဝတ္ထုပုံသဏ္ဍာန်များကို array တစ်ခုအတွင်း သိမ်းဆည်းထားမည့် class တစ်ခုရှိသည်ဆိုပါစို့။

FiguresCollection.php<?php
  class FiguresCollection
  {
    private $figures = []; // ပုံသဏ္ဍာန်များအတွက် array
  }
?>

ကျွန်ုပ်တို့၏ class ထဲတွင် အရာဝတ္ထုများကို collection ထဲသို့ထည့်ရန် addFigure method ကို အကောင်အထည်ဖော်ကြပါစို့။

FiguresCollection.php<?php
  class FiguresCollection
  {
    private $figures = [];
    
    // ပုံသဏ္ဍာန်ပါသော အရာဝတ္ထုတစ်ခုကို parameter အဖြစ် လက်ခံသည်:
    public function addFigure($figure)
    {
      $this->figures[] = $figure;
    }
  }
?>

addFigure method ၏ parameter အဖြစ် ပုံသဏ္ဍာန်ပါသော အရာဝတ္ထုတစ်ခုကို လက်ခံရရှိမည်ဟု ကျွန်ုပ်တို့ မျှော်လင့်ထားသည်မှာ ထင်ရှားပါသည်။ သို့သော် ဤအချက်ကို မည်သည့်ထိန်းချုပ်မှုမျှ မရှိပါ!

အမျိုးအစားအတွက် အရိပ်အမြွက်ပေးခြင်းကို အသုံးပြုပြီး အရာဝတ္ထုများ၏ အမျိုးအစားကို Figure အဖြစ် ရှင်းရှင်းလင်းလင်း ဖော်ပြကြပါစို့။

FiguresCollection.php<?php
  class FiguresCollection
  {
    private $figures = [];
    
    public function addFigure(Figure $figure)
    {
      $this->figures[] = $figure;
    }
  }
?>

ကျွန်ုပ်တို့ လုပ်ဆောင်ခဲ့သည်ကို နားလည်အောင်လုပ်ကြပါစို့။

Figure သည် တကယ်ရှိနေသော class တစ်ခုဖြစ်ခဲ့လျှင် method ၏ parameter သို့ ထို class ၏အရာဝတ္ထုများနှင့် ၎င်း၏ အမွေဆက်ခံသူများကိုပါ ပေးပို့နိုင်မည်ဖြစ်သည်။

သို့သော် ကျွန်ုပ်တို့တွင် Figure သည် အင်တာဖေ့စ်တစ်ခုဖြစ်သည်။ ထိုသို့ဆိုလျှင် အရိပ်အမြွက်ပေးခြင်းသည် method parameter သို့ ကျွန်ုပ်တို့၏ အင်တာဖေ့စ်ကို အကောင်အထည်ဖော်သည့် class များ၏ အရာဝတ္ထုများကိုသာ ပေးပို့နိုင်သည်ဟု ဆိုလိုသည်။

ကျွန်ုပ်တို့၏ class ၏အရာဝတ္ထုတစ်ခုကို ဖန်တီးပြီး ထဲသို့ ပုံသဏ္ဍာန်များထည့်ရန် ကြိုးစားကြည့်ကြပါစို့။

index.php<?php
  $figuresCollection = new FiguresCollection;
  
  // စတုရန်းနှစ်ခု ထည့်ကြမည်:
  $figuresCollection->add(new Quadrate(2));
  $figuresCollection->add(new Quadrate(3));
  
  // ထောင့်မှန်စတုဂံနှစ်ခု ထည့်ကြမည်:
  $figuresCollection->add(new Rectangle(2, 3));
  $figuresCollection->add(new Rectangle(3, 4));
?>

မည်သည့်အခြား class ၏အရာဝတ္ထုကိုမဆို ထည့်ရန် ကြိုးစားခြင်းသည် အမှားတစ်ခုဖြစ်စေမည်။

index.php<?php
  $figuresCollection = new FiguresCollection;
  
  class Test {}; // အခြား class တစ်ခုခု
  $figuresCollection->add(new Test); // အမှားပေးမည်
?>

ဤကဲ့သို့ ထိန်းချုပ်မှုသည် လက်တွေ့တွင် အဘယ်အကျိုးကျေးဇူးပေးသနည်း။ collection ထဲသို့ ထည့်သွင်းထားသော ပုံသဏ္ဍာန်အားလုံးသည် Figure အင်တာဖေ့စ်ကို အကောင်အထည်ဖော်ထားသဖြင့် ၎င်းတို့တစ်ခုစီတွင် getSquare method နှင့် getPerimeter method ရှိမည်ဟု ကျွန်ုပ်တို့ ယုံကြည်စိတ်ချနိုင်သည်။

အနာဂတ်တွင် စတုရန်းနှင့် ထောင့်မှန်စတုဂံများအပြင် ဥပမာအားဖြင့် တြိဂံတစ်ခုလည်း ပေါ်လာနိုင်သည်။ ဤအခြေအနေတွင် တြိဂံတွင်လည်း getSquare နှင့် getPerimeter methods များ ရှိလာမည်ဖြစ်သည်။

လက်တွေ့တွင် ယင်းက အောက်ပါအတိုင်း အကျိုးကျေးဇူးပေးသည်။ ကျွန်ုပ်တို့သည် FiguresCollection class ထဲတွင် ဥပမာအားဖြင့် collection ရှိ ပုံသဏ္ဍာန်အားလုံး၏ စုစုပေါင်းဧရိယာကို ရှာဖွေသည့် getTotalSquare method ကို လုပ်ဆောင်နိုင်သည်။ ဤ method ထဲတွင် ကျွန်ုပ်တို့သည် ပုံသဏ္ဍာန် array ကို loop ဖြင့် ဖြတ်သန်းပြီး ပုံသဏ္ဍာန်တစ်ခုစီတွင် getSquare method ကို ခေါ်ယူပါမည်။

ပုံသဏ္ဍာန်တစ်ခုစီသည် Figure အင်တာဖေ့စ်ကို အကောင်အထည်ဖော်ထားသဖြင့် ပုံသဏ္ဍာန်တစ်ခုစီတွင် getSquare method ရှိမည်ဟု ကျွန်ုပ်တို့သည် 100% ယုံကြည်စိတ်ချနိုင်သည်။

ထို့ကြောင့် method ၏ အကောင်အထည်ဖော်မှုမှာ အောက်ပါအတိုင်းဖြစ်သည်။

php<?php
  class FiguresCollection
  {
    private $figures = [];
    
    public function addFigure(Figure $figure)
    {
      $this->figures[] = $figure;
    }
    
    // စုစုပေါင်းဧရိယာကို ရှာကြမည်:
    public function getTotalSquare()
    {
      $sum = 0;
      
      foreach ($this->figures as $figure) {
        $sum += $figure->getSquare(); // getSquare method ကို အသုံးပြုသည်
      }
      
      return $sum;
    }
  }
?>
Задание 1

ကျွန်ုပ်၏ကုဒ်ကို မကြည့်ဘဲ ထိုကဲ့သို့သော FiguresCollection class တစ်ခုကို အကောင်အထည်ဖော်ပါ။

Задание 2

ပုံသဏ္ဍာန်အားလုံး၏ စုစုပေါင်းပတ်လည်အနားကို ရှာဖွေရန် FiguresCollection class ထဲသို့ getTotalPerimeter method ကို ထည့်သွင်းပါ။