Phương thức __invoke() trong PHP

Phương thức (hàm) __invoke(...$param) là một phương thức ma thuật, nếu trong lớp có khai báo phương thức này thì có thể dùng đối tượng lớp như là một phương thức.

Hãy xem ví dụ lớp sau, có khai báo phương thức __invoke

class Welcome {
    private $name = null;

    public function setName($name): void
    {
        $this->name = $name;
    }

    public function SayHi()
    {
        echo "Xin chào, $this->name";
    }

    // Hàm này sẽ thi hành, nếu sử dụng
    // đối tượng như hàm: $obj('name');
    public function __invoke($name)
    {
         $this->setName($name);
         $this->SayHi();
    }
}

$obj = new Welcome();
$obj('XuanThuLab');

// Xuất ra
// Xin chào, XuanThuLab

Khi khai báo __invoke(), số lượng tham số, kiểu tham số do bạn quyết định, chỉ cần đảm bảo khi gọi $obj(...) thì tham số truyền phù hợp với phai báo.

Phương thức __call() và __callStatic() trong PHP

Phương thức __call cùng là một phương thức ma thuật, khi lớp khai báo có phương thức này, nếu bạn truy cập một phương thức - mà phương thức đó không tồn tại, phương thức __call sẽ tự động được gọi.

Phương thức __callStatic cũng có ý nghĩa như vậy, chỉ khác là nó thi hành khi bạn truy cập một phương thức tĩnh (toán tử truy cập ::) không tồn tại

Cú pháp khai báo của hai hàm này như sau:

// $name là tên hàm truy cập không tồn tại (hoặc bị đóng-ẩn)
// $arguments mảng chứa các tham số khi gọi
public __call(string $name, array $arguments)
{
    ...
}

public __callStatic(string $name, array $arguments)
{
    ...
}

Ví dụ về __call

class PersonInfo
{
    private $name;
    private $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }


    public function __call($name, $arguments)
    {
        switch ($name)
        {
            case 'ShowAge':
                echo "Tuổi là: $this->age<br>";
            break;
            case 'ShowName':
                echo "Tên là: $this->name<br>";
            break;
            default:
                echo "Bạn gọi hàm $name không tồn tại<br>";
                echo 'Bạn đã truyền các tham số<br>';
                echo '<pre>' . print_r($arguments, true). '</pre>';
                break;
        }

    }
}

$obj = new PersonInfo('XUANTHULAB', 5);

// Gọi hàm tên ShowAge, thực tế là không có định nghĩa trong lớp PersonInfo
// __call được thi hành
$obj->ShowAge();
// In ra: Tuổi là: 5

$obj->ShowName();
// In ra: Tên là: XUANTHULAB


$obj->HamXyx(1,2,'XUAN','THU', ['LAB',1,2]);
// In ra:
/*
    Bạn gọi hàm HamXyx không tồn tại
    Bạn đã truyền các tham số
    Array
    (
        [0] => 1
        [1] => 2
        [2] => XUAN
        [3] => THU
        [4] => Array
        (
            [0] => LAB
            [1] => 1
            [2] => 2
        )
    )
*/

Ví dụ về __callStatic

class PersonInfo
{
    public static function WelcomeString()
    {
        echo 'XIN CHÀO';
    }


    public static function __callStatic($name, $arguments)
    {
        echo "<br>Bạn đã gọi hàm tĩnh: $name <br>";
        echo 'Các tham số: <br>';
        echo '<pre>' . print_r($arguments, true). '</pre>';
    }
}

PersonInfo::WelcomeString();
//in ra: XIN CHÀO

PersonInfo::AbcDefXyz(1,2,3);
/* In ra:
Bạn đã gọi hàm tĩnh: AbcDefXyz
Các tham số:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
*/

Đăng ký nhận bài viết mới