xem xét lớp này:PHP làm thế nào để tránh đệ quy vô hạn ở đây?
class test
{
public function __set($n, $v)
{
echo "__set() called\n";
$this->other_set($n, $v, true);
}
public function other_set($name, $value)
{
echo "other_set() called\n";
$this->$name = $value;
}
public function t()
{
$this->t = true;
}
}
Tôi đang quá tải __set()
magic method của PHP. Bất cứ khi nào tôi đặt một thuộc tính trong một đối tượng của lớp test
, nó sẽ gọi __set()
, mà lần lượt gọi other_set()
.
$obj = new test;
$test->prop = 10;
/* prints the following */
__set() called
other_set() called
Nhưng other_set()
có dòng sau $this->$name = $value
. Không nên kết quả này trong một cuộc gọi đến __set()
, gây ra đệ quy vô hạn?
Tôi đã giả định rằng nó sẽ gọi __set()
chỉ khi đặt mọi thứ bên ngoài lớp học. Nhưng nếu bạn gọi phương thức t()
, bạn có thể thấy nó rõ ràng cũng đi qua __set()
.
Điều này là chính xác. Nếu bất cứ ai muốn xem chi tiết triển khai, nó nằm trong 'zend_object_handlers.c'. – Confluence
@Confluence: Cảm ơn ... tôi đã tự hỏi tôi đã đọc ở đâu. :) Không thể tìm thấy nó trong hướng dẫn sử dụng; tôi đã bắt đầu tự hỏi nếu tôi tưởng tượng nó. Nhưng tất cả các bài kiểm tra của tôi đã xác nhận nó, vì vậy ... – cHao
Câu trả lời này rất hữu ích! –