What are some best practices to avoid creating circular references in PHP object relationships to prevent infinite loops?

Circular references in PHP object relationships can lead to infinite loops when trying to serialize or print objects. To avoid this issue, one best practice is to use identifiers or references instead of direct object references when establishing relationships between objects. This can be achieved by storing unique identifiers or keys instead of directly referencing other objects.

class User {
    private $id;
    private $name;
    private $friends = [];

    public function __construct($id, $name) {
        $this->id = $id;
        $this->name = $name;
    }

    public function addFriend($friendId) {
        $this->friends[] = $friendId;
    }

    public function getFriends() {
        return $this->friends;
    }
}

$user1 = new User(1, 'Alice');
$user2 = new User(2, 'Bob');

$user1->addFriend($user2->getId());
$user2->addFriend($user1->getId());

print_r($user1->getFriends());
print_r($user2->getFriends());