Overloading
Overloading là cách tạo động phương thức và thuộc tính trong PHP bằng cách sử dụng cách phương thức magic.
Overloading thuộc tính
Có 4 hàm magic của PHP sử dụng trong overloading thuộc tính là __set()
, __get()
__isset()
và __unset()
. Các hàm này sẽ được thực thi khi sử dụng thuộc tính không tồn tại của class.
Cấu trúc hàm |
Mô tả |
__set(string $name, mixed $value) |
Được gọi khi ghi ghi dữ liệu |
__get(string $name): mixed |
Được gọi khi đọc thuộc tính |
__isset(string $name): bool |
Được gọi khi gọi hàm isset() hoặc empty() |
__unset(string $name ) |
Được gọi khi gọi hàm unset() lên trên thuộc tính |
Xem ví dụ sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?php
class PropertyTest {
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
public function __get($name) {
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
trigger_error("Không tìm thấy thuộc tính $name", E_USER_NOTICE);
}
public function __isset($name) {
return isset($this->data[$name]);
}
public function __unset($name) {
unset($this->data[$name]);
}
}
$obj = new PropertyTest;
$obj->a = 1; // gọi hàm __set('a', 1)
echo $obj->a . "\n"; // gọi hàm __get('a'), in 1
echo (isset($obj->a)); // gọi hàm __isset('a'), in 1 (true)
unset($obj->a); // gọi hàm __unset('a');
echo $obj->a; // gọi hàm __get('a'), in lỗi không tìm thấy thuộc tính
|
Overloading phương thức
Có hai hàm được sử dụng khi Overloading phương thức đó là __call
và __callStatic
. Hai hàm này được gọi khi gọi các phương thức không có trong class.
Cấu trúc hàm |
Mô tả |
__call(string $name, array $args ): mixed |
Gọi hàm không static |
static __callStatic(string $name, array $args ): mixed |
Gọi hàm static |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?php
class MethodTest {
public function __call($name, $arguments) {
echo "Gọi hàm '$name' với các tham số: "
. implode(', ', $arguments). "\n";
}
/* Hổ trợ từ phiên bản PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
echo "Gọi hàm static '$name' với các tham số: "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
// in: Gọi hàm 'runTest' với các tham số: Tham số 1, tham số 2
$obj->runTest('Tham số 1', 'tham số 2');
// in: Gọi hàm static 'runTest' với các tham số: 1, 2, 3
MethodTest::runTest(1,2,3);
|