Generalmente ho 3 classi, un contenitore che contiene una matrice di elementi e un oggetto speciale che è un'altra proprietà della classe contenitore. Quello che devo fare è accedere all'oggetto speciale da un oggetto oggetto all'interno del contenitore. Vedo 2 modi per raggiungere questo obiettivo.
class Container {
protected $object;
protected $items = [];
public function __construct() {
$this->object = new SpecialObject;
}
public function setItem($index, Item $item) {
$this->items[$index] = $item;
}
public function getItem($index) {
return $this->items[$index];
}
}
class Item {
protected $container;
public function __construct(Container $container) {
$this->container = $container;
}
public function action() {
$this->container->object;
}
}
o
class Container {
protected $object;
protected $items = [];
public function __construct() {
$this->object = new SpecialObject;
Registry::set('SpecialObject', $this->object);
}
public function setItem($index, Item $item) {
$this->items[$index] = $item;
}
public function getItem($index) {
return $this->items[$index];
}
}
class Item {
public function action() {
Registry::get('SpecialObject');
}
}
Con il primo esempio il problema che mi preoccupa è che ci sarà un riferimento all'interno di ogni oggetto Item che punta al contenitore, che non è solo ridondante ma se un oggetto cambia contenitore (per qualche motivo, non inteso) avrà un riferimento errato del contenitore e potrebbe causare problemi. Il secondo implica tuttavia che ci sarà solo un'istanza di Container, che potrebbe non essere e probabilmente non sarà il caso. Penso che non ci sia un modo infallibile per afferrare il contenitore di un oggetto, ma cosa suggeriresti è il modo "migliore" per raggiungere questo risultato in termini di prestazioni ed evitare bug?