Đây là các phương thức huyền diệu, aka magic methods dùng với OOP khi mần PHP:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() and __debugInfo()
Hay dùng nhất có lẽ là __construct(), hàm này cho phép tự động khởi tạo và gán giá trị mỗi lần một object mới được tạo từ class đã dựng sẵn. Hàm __construct ()truyền tham số (arguments) từa lưa nên rất tiện.
Ví dụ:
class ABC{ var $a; var $b; public function __construct($a, $b){ $this->a = $a; $this ->b = $b; } } //Khi khởi tạo một object mới từ class thì PHẢI truyền vào hai tham số cho hàm __construct. Ví dụ $a = new ABC('tham số 1', 'tham số 2'); echo $a->a; // Kết quả là 'tham số 1'.
Bài này sẽ bàn về hai tham số khác khá dzui là __toString() và __invoke().
-
__toString()
Nghe tên hàm đã thấy có một sự liên hệ nhẹ với echo và print. Đây là định nghĩa của PHP:
The __toString() method allows a class to decide how it will react when it is treated like a string. For example, what echo $obj; will print. This method must return a string, as otherwise a fatal
E_RECOVERABLE_ERROR
level error is emitted.
Ta biết rằng object khi khởi tạo từ class không thể print hoặc echo, bắt buộc phải var_dump() mới hiển thị được. Vậy __toString() sinh ra để làm việc này. Điểm đặc biệt là khi echo hoặc print tên của object khởi tạo từ class, giá trị từ hàm __toString() sẽ được gọi ra. Quan sát code sau:
class CMD { private $name; private $class = 'CMD'; public function __construct ($name){ $this->name = $name; } public function __toString() { return "Đây là hàm __toString() của tham số truyền vào là $this->name của class $this->class<br>"; } } $a = new CMD ('Vượng'); echo $a; // Nếu không có hàm __toString() thì lỗi ngay. Object of class CMD could not be converted to string // Kết quả in ra là Đây là hàm __toString() của tham số truyền vào là Vượng của class CMD
Như vậy, cứ khi nào khởi tạo một object từ class mà echo hoặc print cái object đó thì kết quả sẽ xuất ra từ hàm __toString() return lại. Lưu ý hàm này KHÔNG NHẬN ARGUMENT.
2. Hàm __invoke()
Trong tiếng Anh, invoke là gợi nhắc, nhắc nhớ. Hàm này được PHP định nghĩa như sau:
The __invoke() method is called when a script tries to call an object as a function.
Giờ thì hiểu vì sao __invoke() và __toString() lại đi với nhau cặp bài trùng. Hóa ra, nếu mừ đối xử với thằng object khởi tạo từ class là string thì mời anh dùng cái _toString(), còn nếu coi cái object đó là function, mời anh dùng __invoke(). Tóm váy lại là:
nếu
+ object ==> string, dùng __toString()
+object ==> function, dùng __toinvoke().
Okey, giờ xét code sau:
class CMD { private $name; private $class = 'CMD'; public function __construct ($name){ $this->name = $name; } public function __toString() // khi echo biến, nó hiện ra kết quả dưới { return "đây là hàm __toString() của tham số truyền vào là $this->name của class $this->class<br>"; } public function __invoke($a){ echo "Đây là cái gì đó từ hàm __invoke nè $a"; } } // echo new CMD; $a = new CMD ('Vượng'); echo $a; /*gọi hàm __invoke vì object mới này coi nó là function*/ echo $a('Việt PHP'); // Kết quả: Đây là cái gì đó từ hàm __invoke nè Việt PHP
Hàm __invoke() có thể nhận tham số (argument) nên trong đoạn code trên ta truyền vào tham số $a.
Điểm khác biệt lớn nhất khi echo $a và echo $a (‘Việt PHP’) là ở chỗ với echo $a, ta coi đây là một string và nó sẽ tự động gọi function __toString(), còn trường hợp 2, nó coi đây là một function và nó gọi function __invoke(), bạn có thể thấy kết quả truyền vào tham số và nhận kết quả trả về “Đây là cái gì đó từ hàm __invoke nè $a“; ==> “Đây là cái gì đó từ hàm __invoke nè Việt PHP“;
Đùng là ảo diệu, magic có khác. Qua bài này thì chú ý rằng, đây là object nên echo hay print lỗi ngay, do đó mới cần các hàm trên.
Dùng magic CONSTANT NHƯ __CLASS__ để gọi class thì hay hơn/