Ghi thuộc tính thông qua ma thuật trong OOP PHP
Phương thức ma thuật __set được gọi
khi có nỗ lực thay đổi giá trị của một thuộc tính
không tồn tại hoặc bị ẩn. Nó nhận tên thuộc tính và giá trị
được cố gắng gán cho nó làm tham số.
Hãy xem một ví dụ thực tế.
Giả sử chúng ta có lớp Test sau:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Hãy tạo phương thức ma thuật
__set trong lớp này, phương thức này sử dụng hàm
var_dump để xuất ra tên thuộc tính
mà đã được truy cập và giá trị
đang cố gắng thiết lập cho thuộc tính đó:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Hãy kiểm tra hoạt động của lớp chúng ta:
<?php
$test = new Test;
$test->prop = 'value'; // var_dump của phương thức __set sẽ xuất ra 'prop value'
?>
Bây giờ hãy thiết lập giá trị
cho thuộc tính có tên được lưu trong biến
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // thiết lập giá trị
}
}
?>
Bây giờ chúng ta có thể ghi giá trị vào các thuộc tính private từ bên ngoài lớp:
<?php
$test = new Test;
$test->prop1 = 1; // ghi 1
$test->prop2 = 2; // ghi 2
?>
Chúng ta có thể ghi, tuy nhiên, để kiểm tra xem có ghi được gì vào đó không - thì không thể, vì các thuộc tính là private.
Có thể tạo getter cho các thuộc tính này hoặc
đơn giản sử dụng phương thức ma thuật
__get. Hãy sử dụng phương án thứ hai:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Getter ma thuật cho thuộc tính:
public function __get($property)
{
return $this->$property;
}
}
?>
Bây giờ chúng ta có thể kiểm tra hoạt động của lớp chúng ta. Hãy kiểm tra:
<?php
$test = new Test;
$test->prop1 = 1; // ghi 1
$test->prop2 = 2; // ghi 2
echo $test->prop1; // sẽ xuất ra 1
echo $test->prop2; // sẽ xuất ra 2
?>
Trên thực tế, dĩ nhiên, không nên cho phép bất kỳ ai cũng có thể ghi vào các thuộc tính private, nếu không sẽ mất đi ý nghĩa của các thuộc tính private này (tốt hơn là làm chúng public và xong).
Vì vậy, phương thức này chỉ nên được áp dụng khi thực sự cần thiết. Trong các bài học tiếp theo, chúng ta sẽ xem xét thêm các ví dụ về ứng dụng thành công của nó.