4. Sử dụng traits trong class

Cú pháp khai báo traits:

trait Name
{
   //code
}

Trong đó Name là tên của traits của các bạn muốn đặt.

Để khai báo một traits trong một lớp ta có cú pháp sau:

<?php
    class MyClass {
        use TraitName;
    }
?>

Trong đó Myclass là tên class mà bạn muốn sử dụng traits, trait là tên traits mà bạn muốn đặt.

Ví dụ:

Khai báo một trait SetGeName có 2 phương thức setName()getName()

<?php
trait SetGetName
{
    // private $name;
    public function setName($name)
    {
        $this->name = $name;
    }
    public function getName()
    {
        return $this->name;
    }
}

Khai báo một trait SetGetAge có 2 phương thức setAge()getAge()namespaceSetGetAge

<?php

namespace SetGetAge;
trait SetGetAge{
    public function setAge($age)
    {
        $this->age = $age;
    }

    public function getAge()
    {
        return $this->age;
    }
}

Cuối cùng ta sẽ gọi 2 trait ở trên vào trong class ConNguoi và đồng thời khởi tạo luôn.

<?php
// Nhúng 2 file chứa trait
include 'SetGetName.php';
include 'SetGetAge.php';
//khai báo class ConNguoi
class ConNguoi
{
    private $name;
    private $age;
    //gọi trait SetGetName
    use SetGetName;
    //gọi trait SetGetAge
    use SetGetAge\SetGetAge;
}
//khởi tạo đối tượng.
$connguoi = new ConNguoi();
// set name;
$connguoi->setName('Thành Nguyễn ');
// get name;
echo $connguoi->getName();
//Tạo khoảng trắng cho dễ phân biệt
echo '<br/>';
// set age
$connguoi->setAge(18);
//get age
echo $connguoi->getAge();
//Kết quả chương trình trả về
//Thành Nguyễn
//18

5. Traits lồng trong PHP hướng đối tượng

Cũng như những cấu trúc câu điều kiện hay vòng lặp thì traits có thể sử dụng lồng nhau.

Cú pháp:

trait A
{
   //
}
trait B
{
    use A;
   // 
}

Lúc này thì khi ta gọi trait B thì ta cũng có thể sử dụng đầy đủ chức năng của trait A.

6. Phương thức tĩnh và phương thức trừu tượng trong traits

Trong traits thì đều có cho chúng ta cả phương thức và thuộc tính tĩnh, trừu tượng như một class bình thường. Các thuộc tính và phương thức tĩnh chỉ ảnh hưởng bên trong một class thôi còn khi gọi nó ở trong một class khác thì hoàn toàn bình thường.

Ví dụ:

Thuộc tính tĩnh trong traits

<?php

// Khai báo trait Name
trait Name
{
    private static $name = 'Chưa xét';

    public function setName($name)
    {
        self::$name = $name;
    }

    public function getName()
    {
        return self::$name;
    }
}

//Khai báo class ConNguoi
class ConNguoi
{
    //gọi trait Name
    use Name;
}

//Khai báo class NguoiLon
class NguoiLon
{
    //gọi trait Name
    use Name;
}

// khởi tạo class ConNguoi
$connguoi = new ConNguoi();

//setName
$connguoi->setName('Thành Nguyễn');

//getName
echo $connguoi->getName();
//Kết Quả: Thành Nguyễn

//Khởi tạo class ConNguoi
$trecon = new ConNguoi();

//getName
echo $trecon->getName();
//Kết Quả: Thành Nguyễn

//Khởi tạo class NguoiLon 
$nguoilon = new NguoiLon();

//getName
echo $nguoilon->getName();
//Kết Quả: Chưa xét

Phương thức trừu tượng:

<?php

// Khai báo trait Name
trait Name
{
    public static function getName()
    {
        return 'Name Trait';
    }
}

//Khai báo class ConNguoi
class ConNguoi
{
    //gọi trait Name
    use Name;
}

// khởi tạo class ConNguoi
$connguoi = new ConNguoi();

//getName
echo $connguoi->getName();
//Kết Quả: Name Trait

//hoặc
echo ConNguoi::getName();
//Kết Quả: Name Trait

7. Thay đổi phạm vi truy cập của traits trong OOP

Cú pháp:

use methodName as visibility;

trong đó : methodName là phương thức mà ta muốn thay đổi và visibility là 3 mức truy cập(public, private, protected).

Ví dụ:

<?php

// Khai báo trait Name
trait Name
{
    //khai báo thuộc tính name= Thành Nguyễn
    private $name = 'Thành Nguyễn';

    //định nghĩa phương thức getName
    abstract public function getName();
}

//Khai báo class ConNguoi
class ConNguoi
{
    //gọi trait Name
    use Name;

    //khai báo và định nghĩa lại phương thức getName()
    public function getName()
    {
        return $this->name;
    }
}

// khởi tọa class ConNguoi
$connguoi = new ConNguoi();
//getName
echo $connguoi->getName();
//Kết Quả: Thành Nguyễn

8. Tạo định danh mới cho Traits và ưu tiên trong Traits

Sử dụng insteadof để xét độ ưu tiên cho phương thức bạn muốn sử dụng.

Ví dụ:

class ConNguoi
{
    private $name;
    private $age;
    //gọi trait
    use SetGetName, SetGetAge {
        //ưu tiên sử dụng phương thức getall của trait SetGetAge
        SetGetAge::getAll insteadof SetGetName;
    }
}

Cũng như ưu tiên phương thức thì ta cũng có thể tạo định danh mới cho traits.

Ví dụ: Vừa thay đổi phương thức và vừa tạo định danh mới cho phương thức getName.

<?php

trait Name
{
    private $name = 'Thành Nguyễn';

    private function getName()
    {
        return $this->name;
    }
}

class ConNguoi
{
    use Name {
        //Định danh mới cho getName
        getName as public doName;
    }
}

$connguoi = new ConNguoi();

echo $connguoi->doName();
//Kết Quả: Thành Nguyễn