Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 16: Gọi nhiều phương thức trên một dòng

Tiếp tục series bài hôm nay chúng ta sẽ  tìm hiểu về cách gọi được nhiều hàm của một class trên cùng một dòng qua các -> như các framework thường dùng.

1, Ví dụ.

-Ví dụ như module Query Builder của Laravel chúng ta co thể gọi được như sau:

DB::table('users')->where('name', 'John')->first();

-Hay cả với Query Builder Class của Codeigniter họ cũng có có thể gọi được như vậy.

$this->db->select('*')->from('blogs')->join('comments', 'comments.id = blogs.id');

2, Xây dựng call multiple methods.

-Thực ra để làm được như các ví dụ trên thì cũng hết sức đơn giản, các bạn chỉ cần return lại chính đối tượng đó ($this) sau mỗi methods được.

VD:

<?php

class ConNguoi
{
    private $name;

    public function setName($name = 'Con Nguoi')
    {
        $this->name = $name;
        //trả về đối tượng hiện tại
        return $this;
    }

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

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

//gọi nhiều phương thức trên một dòng
echo $connguoi->setName('Vũ Thanh Tài')->getName();
//Kết quả: Vũ Thanh Tài

- Bây giờ chúng ta sẽ thử bỏ this đi xem nó có chạy được không nhé.

<?php

class ConNguoi
{
    private $name;

    public function setName($name = 'Con Nguoi')
    {
        $this->name = $name;
    }

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

//Khởi tạo class
$connguoi = new ConNguoi();
//gọi nhiều phương thức trên một dòng
echo $connguoi->setName('Vũ Thanh Tài')->getName();
//Kết quả: Fatal error: Call to a member function getName() on null

-Như các bạn cũng đã thấy đó. Chương trình đã báo lỗi.

-Vậy tiếp tục chúng ta để return $this và thử gọi phương thức setName() 2 lần xem có được không nhé!

<?php

class ConNguoi
{
    private $name;

    public function setName($name = 'Con Nguoi')
    {
        $this->name = $name;
        //trả về đối tượng hiện tại
        return $this;
    }

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

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

//gọi nhiều phương thức trên một dòng
echo $connguoi->setName('Vũ Thanh Tài')->setName('Vũ Văn A')->getName();
//Kết quả: Vũ Văn A

-oh, Chương trình vẫn chạy và nó nhận setName() cuối cùng. Như thế chúng ta có thể đưa ra được cá kết luận rồi.

Kết Luận

- Khi chương trình sử dụng return $this  thì cũng đồng nghĩa với phương thức đó trả về chính đối tượng mà nó đang được thực thi và lúc này các xử lý của phương thức đó cũng được add vào đối tượng. Để chứng minh chúng ta sẽ cùng var_dump() dữ liệu trước và sau khi thực thi hàm xem nhé.

<?php

class ConNguoi
{
    private $name;

    public function setName($name = 'Con Nguoi')
    {
        $this->name = $name;
        //trả về đối tượng hiện tại
        return $this;
    }

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

$connguoi = new ConNguoi();
//var_dump đối tượng sau khi khởi tạo
var_dump($connguoi);
/*
//kết quả:
object(ConNguoi)#1 (1) {
  ["name":"ConNguoi":private]=>
  NULL
}
*/
var_dump($connguoi->setName('Vũ Thanh Tài'));
/*
Kết quả:
object(ConNguoi)#1 (1) {
  ["name":"ConNguoi":private]=>
  string(14) "Vũ Thanh Tài"
}
*/

-Kết quả như ý muốn đúng không các bạn?, Và vì nó trả về mọt object như thế nên các bạn có thể gọi luôn được đến các phương thức tiếp theo trong đối tượng.

3, Lời kết.

-Như thế mình đã trình bày xong về thủ thuật gọi nhiều methods trên một dòng như các framework vẫn sử dụng đến mọi người rồi. Nó thật đơn giản đúng không?

Đă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

3 Comments

<script>alert('Thêm thành công')</script>

Thao

5 năm trước

công nhận hay. bảo sao nhin laravel thấy hay dùng mà cũng chỉ bit ghi nhận điều đó đúng

ngo duc tiep

3 năm trước

hay

mạnh

9 tháng trước

Bình luận

Captcha