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 ) */