Traits ใน OOP ของ PHP
อย่างที่คุณทราบแล้ว ใน PHP ไม่สามารถสืบทอดได้จากหลายคลาสพร้อมกันได้ สืบทอดได้จากคลาสเดียวเท่านั้น ก่อนหน้านี้เราได้รู้จักวิธีแก้ปัญหานี้แล้ว: แทนที่การสืบทอด ให้ใช้วัตถุของคลาสหนึ่งภายในคลาสอื่น
ใน PHP มีวิธีอื่นอีก ซึ่งก็คือการใช้ Traits Trait คือชุดของคุณสมบัติและเมธอดที่สามารถนำไปรวมไว้ในคลาสอื่นได้ ซึ่งคุณสมบัติและเมธอดของ Trait จะถูกมองโดยคลาสราวกับเป็นของตัวเอง
ไวยากรณ์ของ Trait นั้นเหมือนกับคลás ยกเว้นว่าชื่อ Trait ต้องประกาศโดยใช้คำสั่ง trait
ไม่สามารถสร้างอินสแตนซ์ของ Trait ได้ - Traits มีไว้สำหรับการเชื่อมต่อกับคลาสอื่นเท่านั้น การเชื่อมต่อนั้นทำได้ด้วยคำสั่ง use หลังจากนั้นตามด้วยช่องว่างและชื่อของ Trait ที่ต้องการเชื่อมต่อ คำสั่งนี้เขียนไว้ที่ต้นคลาส
มาดูการใช้งาน Traits ในตัวอย่างปฏิบัติกัน สมมติว่าเรามี Trait Helper นี้ ซึ่งมีคุณสมบัติส่วนตัว name และ age พร้อมทั้ง getters ของพวกมัน:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
สมมติว่าเรามีคลาส User นี้ ซึ่งในคอนสตรัคเตอร์มีการกำหนดคุณสมบัติ name และ age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
ทีนี้มาเพิ่ม getters สำหรับคุณสมบัติของคลาส User ของเรากัน แต่เราจะไม่เขียนมันลงในคลás เอง แค่เชื่อมต่อ Trait Helper ซึ่งเมธอดเหล่านี้ได้ถูกนำไปใช้แล้ว:
<?php
class User
{
use Helper; // เชื่อมต่อ trait
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
หลังจากเชื่อมต่อ Trait แล้ว ในคลásของเราจะปรากฏเมธอดและคุณสมบัติของ Trait นั้น โดยเราจะอ้างอิงถึงพวกมันราวกับเป็นเมธอดและคุณสมบัติของคลาสเอง:
<?php
$user = new User('john', 30);
echo $user->getName(); // จะแสดง 'john'
echo $user->getAge(); // จะแสดง 30
?>
เขียนคลาส City พร้อมคุณสมบัติ name, age, population และ getters สำหรับพวกมัน ให้คลาสของเราใช้ Trait Helper ที่เราสร้างไว้แล้ว เพื่อย่อโค้ดของตัวเอง