Trong các đối tượng ý kiến của tôi nên không thay đổi đối với các đối tượng giá trị. Khác hơn là nó không có nhiều lợi ích trừ khi bạn đang chia sẻ đối tượng của bạn trên toàn bộ ứng dụng của bạn.
Có một số câu trả lời sai ở đây, đối tượng không thay đổi có thể có bộ định vị. Dưới đây là một số thực hiện các đối tượng bất biến trong PHP.
Ví dụ số 1.
class ImmutableValueObject
{
private $val1;
private $val2;
public function __construct($val1, $val2)
{
$this->val1 = $val1;
$this->val2 = $val2;
}
public function getVal1()
{
return $this->val1;
}
public function getVal2()
{
return $this->val2;
}
}
Như bạn có thể thấy ngay khi bạn không thể thay đổi bất kỳ giá trị nào.
Ví dụ 2: với setters
:
class ImmutableValueObject
{
private $val1;
private $val2;
public function __construct($val1, $val2)
{
$this->val1 = $val1;
$this->val2 = $val2;
}
public function getVal1()
{
return $this->val1;
}
public function withVal1($val1)
{
$copy = clone $this;
$copy->val1 = $val1;
return $copy; // here's the trick: you return a new instance!
}
public function getVal2()
{
return $this->val2;
}
public function withVal2($val2)
{
$copy = clone $this;
$copy->val2 = $val2;
return $copy;
}
}
Có nhiều thi thể và điều này là không phải là một danh sách độc quyền. Và hãy nhớ rằng với Reflection luôn luôn có một cách để có được xung quanh đó trong PHP, vì vậy bất biến là tất cả trong đầu của bạn cuối cùng!
Nó cũng thường là thực hành tốt để đặt các đối tượng bất biến là cuối cùng.
EDIT:
- thay đổi setX cho withX
- thêm nhận xét về thức
Nguồn
2015-11-25 02:52:00
Bạn có thấy bất kỳ lợi ích trong có lớp học mà làm điều này? Tôi có thể xem xét một cách tiếp cận tốt hơn sẽ chỉ đơn giản là từ chối * settability * (có tôi đã làm điều đó lên) vào tài sản bạn không muốn thay đổi, buộc họ phải tạo một trường hợp mới nếu cần thiết. EDIT: Yea, những gì ThiefMaster nói :) –
http: // stackoverflow.com/questions/7317037/php-immutable-public-member-fields ví dụ này có thể giúp bạn hiểu rõ hơn –