Diciamo che ho uno scaffale sul quale posso mettere gli articoli che sono fissabili (non sono sicuro che sia effettivamente una parola ma puoi capire il mio punto). Quindi ho il seguente:
class Shelf
{
/** @var ShelfableItemInterface[] **/
private $items = [];
// addItem, getItems...
}
interface ShelfableItemInterface
{
}
/** let's imagine that not all books are shelfable **/
class Notebook extends Book implements ShelfableItemInterface
{
}
class PhotoFrame implements ShelfableItemInterface
{
}
Quindi quelle sono le definizioni, e ora posso creare degli scaffali con diversi elementi su di essi:
$shelf = new Shelf();
$shelf->addItem(new Notebook(...));
$shelf->addItem(new PhotoFrame(...));
$shelf->addItem(new PhotoFrame(...));
// will return the three items
var_dump($shelf->getItems());
Quindi, questo funziona perfettamente mentre tutti i dati non sono persistenti e recuperati dalla memoria.
Attualmente sto usando Doctrine ORM che può recuperare automaticamente gli oggetti correlati e creare un'istanza degli oggetti delle loro classi appropriate, ma funziona solo se tutti gli elementi correlati estendono la stessa classe che dovrebbe essere impostata nella definizione della relazione.
Questo è un problema in quanto non voglio essere costretto a estendere alcune classi (dal momento che possiamo vedere che il Notebook estende già qualcosa), ma facciamo in modo che la relazione funzioni per interfaccia.
So che avrei ancora qualche strategia di mappatura (o comunque dovremmo chiamarla), quindi per esempio nel database avremo una tabella con il seguente:
+----+---------+-----------+
| id | shef_id | item_type |
+----+---------+-----------+
| 1 | 5 | 1 |
| 2 | 5 | 2 |
| 3 | 5 | 2 |
+----+---------+-----------+
(dati aggiuntivi in tabelle per tipo)
Quindi, sono confuso su come fare questo lavoro o dove mettere il processo, in modo che l'ORM (o la mia logica) sappia che quando chiamo getItems (), quando prelevo gli elementi correlati, se "item_type "è 2, dovrebbe istanziare l'oggetto da PhotoFrame, 1 per Notebook ecc.
Non so se ho dichiarato chiaramente il mio problema, ma spero che tu possa capirmi.
Aggiornamento: vedo che questo è disponibile in java - link senza la parte dell'ereditarietà della classe, ma mi piacerebbe sapere come posso ottenere ciò in php senza tale libreria