Tôi đang xây dựng một mảng các đối tượng. Tôi cần mảng này để chỉ chứa một lần của một đối tượng nhất định, có nhiều tham chiếu đến cùng một đối tượng nên ném một ngoại lệ. Tôi đang sử dụng đoạn mã sau để đạt được điều này:in_array trên các đối tượng có tham chiếu vòng tròn
public function addField ($name, iface\Node $field)
{
// Prevent the same field being added multiple times
if (!in_array ($field, $this -> fields))
{
$this -> fields [$name] = $field;
$field -> setParent ($this);
}
else
{
throw new \InvalidArgumentException ('This field cannot be added to this group');
}
return ($this);
}
này bắt đầu dẫn đến các vấn đề khi tôi bắt đầu thực hiện các đối tượng mà thực hiện giao diện Node, vì chúng có thể bao gồm tài liệu tham khảo tròn (họ giữ một bộ sưu tập của các nút con của họ , với mỗi đứa trẻ giữ một tham chiếu đến cha mẹ của nó). Cố gắng để thêm một lĩnh vực có thể dẫn đến các lỗi sau được tạo ra:
PHP Fatal error: Nesting level too deep - recursive dependency?
Tôi nghi ngờ rằng PHP đang cố gắng đi qua toàn bộ mảng đối tượng, thay vì chỉ so sánh các tham chiếu đối tượng để xem nếu họ giữ giá trị như nhau và do đó chỉ vào cùng một đối tượng.
Điều tôi cần in_array để làm là chỉ so sánh các tham chiếu đối tượng mà nó lưu trữ với tham chiếu đối tượng của trường. Điều này sẽ ngăn chặn nó cố gắng đi qua toàn bộ cây đối tượng và chạy vào vấn đề đệ quy.
Có cách nào để thực hiện việc này không?
Hãy thử ghi đè '__equals' trên đối tượng của bạn để triển khai phương pháp kiểm tra bình đẳng phù hợp hơn cho mục đích của bạn. –