Giới thiệu
Khái niệm nạp chồng (overloading) trong PHP khác so với các ngôn ngữ hướng đối tượng khác như C++ hoặc Java. Ở các ngôn ngữ đó, nạp chồng nghĩa là khả năng có nhiều phương thức cùng tên nhưng với tham số và/hoặc kiểu trả về khác nhau. Trong PHP, nạp chồng đề cập đến tính năng tạo động thuộc tính và phương thức. Các phương thức ma thuật (magic methods - tên phương thức bắt đầu bằng dấu gạch dưới kép) được sử dụng để thiết lập các thuộc tính và phương thức động.
Nạp chồng thuộc tính
Các phương thức ma thuật sau được dùng cho nạp chồng thuộc tính:
Cú pháp
public __set(string $name, mixed $value): void public __get(string $name): mixed public __isset(string $name): bool public __unset(string $name): void
- __set() được gọi khi ghi dữ liệu vào thuộc tính không thể truy cập (protected, private hoặc không tồn tại).
- __get() đọc dữ liệu từ thuộc tính không thể truy cập.
- __isset() được gọi khi sử dụng isset() hoặc empty() trên thuộc tính không thể truy cập.
- __unset() được gọi khi unset() được sử dụng trên thuộc tính không thể truy cập.
Ví dụ
Trong đoạn mã sau, một thuộc tính động tên myprop được thiết lập, truy xuất và hủy:
<?php
class myclass {
public function __set($name, $value) {
echo "setting $name property to $value \n";
$this->$name = $value;
}
public function __get($name) {
echo "value of $name property is ";
return $this->$name;
}
public function __isset($name) {
return isset($this->$name);
}
public function __unset($name) {
unset($this->$name);
}
}
$obj = new myclass();
$obj->myprop = "test";
echo $obj->myprop . "\n";
var_dump(isset($obj->myprop));
unset($obj->myprop);
var_dump(isset($obj->myprop));
?>
Kết quả
setting myprop property to test value of myprop property is test bool(true) bool(false)
Nạp chồng phương thức
Hai phương thức ma thuật dùng để tạo động phương thức là __call() và __callStatic():
public __call(string $name, array $arguments): mixed public static __callStatic(string $name, array $arguments): mixed
- __call() được kích hoạt khi gọi phương thức không thể truy cập trong ngữ cảnh đối tượng.
- __callStatic() được kích hoạt khi gọi phương thức không thể truy cập trong ngữ cảnh tĩnh (static).
Ví dụ nạp chồng phương thức
<?php
class myclass {
public function __call($name, $args) {
// Lưu ý: giá trị $name phân biệt chữ hoa/thường
echo "Calling object method $name with " . implode(" ", $args) . "\n";
}
public static function __callStatic($name, $args) {
echo "Calling static method $name with " . implode(" ", $args) . "\n";
}
}
$obj = new myclass();
$obj->mymethod("Hello World!");
myclass::mymethod("Hello World!");
?>
Kết quả
Calling object method mymethod with Hello World! Calling static method mymethod with Hello World!