Traits ใน OOP ของ PHP

อย่างที่คุณทราบแล้ว ใน PHP ไม่สามารถสืบทอดได้จากหลายคลาสพร้อมกันได้ สืบทอดได้จากคลาสเดียวเท่านั้น ก่อนหน้านี้เราได้รู้จักวิธีแก้ปัญหานี้แล้ว: แทนที่การสืบทอด ให้ใช้วัตถุของคลาสหนึ่งภายในคลาสอื่น

ใน PHP มีวิธีอื่นอีก ซึ่งก็คือการใช้ Traits Trait คือชุดของคุณสมบัติและเมธอดที่สามารถนำไปรวมไว้ในคลาสอื่นได้ ซึ่งคุณสมบัติและเมธอดของ Trait จะถูกมองโดยคลาสราวกับเป็นของตัวเอง

ไวยากรณ์ของ Trait นั้นเหมือนกับคลás ยกเว้นว่าชื่อ Trait ต้องประกาศโดยใช้คำสั่ง trait

ไม่สามารถสร้างอินสแตนซ์ของ Trait ได้ - Traits มีไว้สำหรับการเชื่อมต่อกับคลาสอื่นเท่านั้น การเชื่อมต่อนั้นทำได้ด้วยคำสั่ง use หลังจากนั้นตามด้วยช่องว่างและชื่อของ Trait ที่ต้องการเชื่อมต่อ คำสั่งนี้เขียนไว้ที่ต้นคลาส

มาดูการใช้งาน Traits ในตัวอย่างปฏิบัติกัน สมมติว่าเรามี Trait Helper นี้ ซึ่งมีคุณสมบัติส่วนตัว name และ age พร้อมทั้ง getters ของพวกมัน:

Helper.php<?php
  trait Helper
  {
    private $name;
    private $age;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getAge()
    {
      return $this->age;
    }
  }
?>

สมมติว่าเรามีคลาส User นี้ ซึ่งในคอนสตรัคเตอร์มีการกำหนดคุณสมบัติ name และ age:

User.php<?php
  class User
  {
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

ทีนี้มาเพิ่ม getters สำหรับคุณสมบัติของคลาส User ของเรากัน แต่เราจะไม่เขียนมันลงในคลás เอง แค่เชื่อมต่อ Trait Helper ซึ่งเมธอดเหล่านี้ได้ถูกนำไปใช้แล้ว:

User.php<?php
  class User
  {
    use Helper; // เชื่อมต่อ trait
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

หลังจากเชื่อมต่อ Trait แล้ว ในคลásของเราจะปรากฏเมธอดและคุณสมบัติของ Trait นั้น โดยเราจะอ้างอิงถึงพวกมันราวกับเป็นเมธอดและคุณสมบัติของคลาสเอง:

index.php<?php
  $user = new User('john', 30);
  echo $user->getName(); // จะแสดง 'john'
  echo $user->getAge();  // จะแสดง 30
?>
Задание 1

เขียนคลาส City พร้อมคุณสมบัติ name, age, population และ getters สำหรับพวกมัน ให้คลาสของเราใช้ Trait Helper ที่เราสร้างไว้แล้ว เพื่อย่อโค้ดของตัวเอง