Overloading

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()__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__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);