PHP OOP: ogni oggetto dovrebbe contenere tutti i dati?

5

Sto cercando di imparare PHP OOP "correttamente", e mi stavo chiedendo, dovrebbe il costruttore prendere tutte le informazioni nel database e memorizzarlo nell'oggetto?

Per utilizzare un esempio che sto cercando di creare usando PHP OOP , un sito web di fumetti su Internet (simile a quello di XKCD), avrebbe due classi:

  • Catalogo (elenco e ordine di tutti gli episodi)
  • Episodio (dati relativi a quel particolare episodio)

Quindi, in questa situazione, l'oggetto Catalogue ottiene una matrice di tutti gli episodi (presumibilmente questo sarebbe ottenuto nel costruttore)? E se è così, vuol dire che devo aggiornare sia l'array dell'oggetto che l'array del database? E se sì, qual è il modo più comune di implementare questa azione (presumibilmente molto comune)?

    
posta Django Reinhardt 21.02.2013 - 19:08
fonte

2 risposte

6

Esistono diversi approcci che è possibile utilizzare per eseguire questa operazione, a seconda del set di dati, delle esigenze di rendimento e delle preferenze generali.

Se c'è un oggetto che è usato quasi esclusivamente per la visualizzazione, probabilmente vorrai interrogare il set di dati in anticipo in una sorta di Fabbrica e quindi creare l'oggetto passando i dati nel costruttore.

Se c'è un oggetto che tocca un gruppo di origini dati e viene utilizzato per cose diverse, il caricamento di tutti i dati all'istantanea potrebbe richiedere molto tempo e tutti i dati dell'oggetto potrebbero non essere necessari ogni volta che l'oggetto viene istanziato . Puoi sfruttare il carico pigro per raggiungere questo obiettivo.

Se le prestazioni sono una preoccupazione importante e l'oggetto memorizza una tonnellata di dati ma è per lo più immutabile, puoi utilizzare qualcosa come il peso vivo modello, che ti consente di trattare effettivamente un singolo oggetto come una raccolta.

Consiglio vivamente di provare alcuni modi diversi di fare le cose. Per un progetto come il tuo, il modo in cui scegli di istanziare e popolare l'oggetto probabilmente avrà poca importanza, ma sarà un buon esercizio divertente in oggetto diverso .

Come nota finale, gran parte delle conoscenze che stai acquisendo ora su OOP possono essere applicate a quasi tutte le lingue che impari in futuro.

    
risposta data 21.02.2013 - 20:16
fonte
2

Sono un grande fan del modo in cui Magento ha astratto i livelli del database in più livelli e relazioni con i modelli di raccolta.

Questo potrebbe non rispondere direttamente alla domanda, ma potrebbe aprire la porta a pensare un po 'diversamente agli oggetti base dati.

Il modo in cui chiameresti un singolo cliente è qualcosa come:

 $customer = Mage::getModel('customer')->load('20');

Dove il metodo getModel istanzia una classe caricata magicamente da un file di definizione XML. In questo caso, diciamo che è chiamato Mage_Core_Model_Customer .

Il tuo modello base si estende quasi sempre da una classe genitore che gestisce l'astrazione del database e quella classe si estende da una classe di oggetti generica che imposta getter e setter magici per tutte le classi del modello. Quindi, se qualcosa si estende dall'astrazione del database, riprende anche i metodi getter e setter.

Nel fare load('20') stai specificando che vorresti caricare l'oggetto del database con la chiave id che è 20 .

Ora specificamente sulla tua domanda. Magento usa anche la mappatura relazionale tra ogni entità e il loro oggetto seme. Ad esempio un cliente può avere molti indirizzi. Il loro indirizzo non viene restituito in modo naturale come parte dell'oggetto, tuttavia se si desidera ottenere un attributo particolare non incluso nella tabella seed, si dovrebbe fare qualcosa del genere:

$collection = $customer->getCollection()
    ->addAttributeToSelect('address1')
    ->addAttributeToSelect('address2');
$collection->load();

Una raccolta è fondamentalmente solo un elenco di oggetti del database.

Questo diventa una soluzione ben progettata perché gli oggetti non sono accoppiati l'un l'altro come un'unica entità. Invece, puoi filtrare ogni associazione separatamente.

Non inviare commenti su come nessuno del codice qui funzionerebbe in Magento. Questo era per l'illustrazione

    
risposta data 03.03.2013 - 21:42
fonte

Leggi altre domande sui tag