Запретить рекурсию объекта / цикл по ссылке в PHP - PullRequest
0 голосов
/ 30 октября 2019

Еще не нашел ответа, но я уверен, что должен быть один: как предотвратить рекурсию / цикл объекта, когда объекты ссылаются друг на друга? Пример:

class Patient {
    private $Issues = array();

    [...]

    public function __construct($id) {
        [ Get data from DB ]
        while ($row = $result->fetch_assoc()) {
            $this->Issues[$row['idIssue']] = new Issue($row['idIssue']);
        }
        [...]
    } 
}

class Issue {
    private $Patient;

    [...]

    public function __construct($id) {
        [ Get data from DB ]
        $this->Patient = new Patient($row['idPatient']); <-- Leads to recursion as the patient will load all it's Issues() etc. etc.
        [...]
    }
}

Как мне предотвратить это? Я мог бы использовать идентификатор Patient () вместо реального объекта, но это похоже на взлом. Есть ли способ использовать реальный объект?

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Вы можете (должны!) Отделять соединение / запросы к БД от определений сущностей и передавать ссылки на отношения, в противном случае вы не можете смоделировать сущности, плюс смешивание соединения с БД и определение сущностей противоречит разделению проблем :

// somewhere in your code
$idPatient = 42;
$patient = new Patient();
$patient->setId($idPatient);

// get datas from DB
while ($row = $result->fetch_assoc())
{
    $issue = new Issue();
    $issue->setId($row['idIssue'])
          ->setPatient($patient);

    $patient->addIssue($issue);

    // or, shorter way :
    // $patient->addIssues((new Issue())->setId($row['idIssue'])
    //                                  ->setPatient($patient));
}

class Patient {
    private $Issues = array();
    private $Id;

    public function addIssue(Issue $issue): self
    {
        $this->Issues[] = $issue;

        return $this;
    }

    public function setId(int $id): self
    {
        $this->Id = $id;

        return $this;
    }
}

class Issue {
    private $Patient;
    private $Id;

    public function addPatient(Patient $patient): self
    {
        $this->Patient = $patient;

        return $this;
    }

    public function setId(int $id): self
    {
        $this->Id = $id;

        return $this;
    }

}
1 голос
/ 30 октября 2019

Не воссоздавать объект. Просто передайте экземпляр объекта master конструктору detail . Например:

class Patient {
    private $Issues = array();

    [...]

    public function __construct($id) {
        [ Get data from DB ]
        while ($row = $result->fetch_assoc()) {
            $this->Issues[$row['idIssue']] = new Issue($row['idIssue'], $this);
        }
        [...]
    } 
}

class Issue {
    private $Patient;

    [...]

    public function __construct($id, Patient $patient) {
        [ Get data from DB ]
        $this->Patient = $patient
        [...]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...