Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 13: Traits trong PHP (phần 2)

Tiếp tục với phần trước phần này chúng ta sẽ tìm hiểu nốt về các vấn đề liên quan đến Traits (mà mình biết).

1, Phương thức tĩnh trong Traits.

-Trong Traits có hỗ trợ cho chúng ta cả phương thức tĩnh và thuộc tính tĩnh như một class bình thường.

Thuộc tính tĩnh

VD: 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('Vũ Thanh Tài');

//getName
echo $connguoi->getName();
//Kết Quả: Vũ Thanh Tài

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

//getName
echo $trecon->getName();
//Kết Quả: Vũ Thanh Tài

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

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

Kết Luận: Như vậy Thuộc tính tĩnh chỉ ảnh hưởng bên trong một class thôi còn khi gọi nó ở tron một class khác thì hoàn toàn bình thường.

Phương thức tĩnh

VD: Phương thức tĩnh trong trait.

<?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

Kết Luận: Phương thức tĩnh trong trait hoàn toàn giống phương thức tĩnh trong class.

2, Phương thức trừu tượng trong trait.

-Trait cũng hỗ trợ chúng ta sử dụng phương thức trừu tượng (xem phương thức trừu tượng).

VD:

<?php

// Khai báo trait Name
trait Name
{
    //khai báo thuộc tính name= vũ Thanh Tài
    private $name = 'Vũ Thanh Tài';

    //đị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ả: Vũ Thanh Tài

3, Thay đổi visibility của phương thức trait.

-Có đôi khi các bạn muốn thay đổi visibility (phạm vi truy cập) của một hoặc nhiều phương thức trong traits thì phải làm sao? Trong PHP cũng có hỗ trợ chúng ta thay đổi visibility của phương thức trong traits với cú pháp như sau:

use methodName as visibility;

Trong đó:

  • methodName là phương thức các bạn muốn thay đổi.
  • visibility là một trong 3 mức truy cập: public,protected, private.

VD:

<?php

trait Name
{
    private $name = 'Vũ Thanh Tài';

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

class ConNguoi
{
    use Name {
        //thay đổi visibitily thành public
        getName as public;
    }
}

$connguoi = new ConNguoi();
echo $connguoi->getName();
//Kết Quả: Vũ Thanh Tài

4, Tạo định danh mới cho Traits.

-Không những bạn có thể ưu tiên phương thức trong traits hay thay đổi visibility, mà bạn còn có thể tạo định danh mới cho traits trong PHP nữa.

VD: Tạo định danh mới cho phương thức getName thành doName.

<?php

trait Name
{
    private $name = 'Vũ Thanh Tài';

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

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

$connguoi = new ConNguoi();

echo $connguoi->doName();
//Kết Quả: Vũ Thanh Tài

-Hoặc chúng ta cũng có thể vừa thay đổi visibility vừa tạo định danh mới cho phương thức.

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

<?php

trait Name
{
    private $name = 'Vũ Thanh Tài';

    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ả: Vũ Thanh Tài

5, So sánh Traits với abstract và interface.

Traits với interface

-Giống nhau: Đều không có thể khởi tạo được mà chỉ có thể khai báo.

-Khác nhau:

  • Trait:
    • Có thể khai báo thuộc tính.
    • Có thể định nghĩa và khởi tạo phương thức.
  • interface:
    • Chỉ có thể khai báo thuộc tính cố định (hằng).
    • Chỉ có thể định nghĩa không thể khai báo.

Traits với abstract

-Giống nhau: Đều không có thể khởi tạo được mà chỉ có thể khai báo.

-Khác nhau:

  • Trait:
    • Có thể lồng nhau một cách đơn giản
  • abstract:
    • Khi muốn sử dụng lẫn nhau phải kế thừa hết sức lằng nhằng.

6, Lời kết.

-Qua 2 phần trình bày về traits của mình (xem phần 1), mình hi vọng mọi người có thể hiểu hết được các vấn đề của mình đưa ra. Đó mới chỉ là những gì mà mình biết về Traits thôi còn các bạn nào muốn tìm hiểu thêm có thể tham khảo tại link.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

4 Comments

Anh Tài xem lại chỗ So sánh Traits với interface.

interface:

    • Chỉ có thể định nghĩa không thể khai báo. => Chỉ có thể khai báo chứ không thể định nghĩa chứ anh

    Chương

    6 năm trước

    Khai báo và Định nghĩa là sao nhỉ Admin?

    Minh Vũ

    6 năm trước

    tức là có thể viết tên hàm nhưng trong thân hàm không có gì.

    ví dụ:

    interface ViDu{

    public function xinChao(){};

    }

    Phương thức/hàm xinChao() không có gì cả, và phải có dấu ; phía sau. Đây là khai báo mà không thể định nghĩa.

    Vượng

    6 năm trước

    hihi

    code everyone

    5 năm trước

    Bình luận

    Captcha