Quale sarà il modo migliore per accedere alle informazioni da un altro oggetto

1

Ho un oggetto page , che ha Paragraph e Image raccolte di oggetti

E ogni paragraph ha solo image_id(s) assegnato a un paragrafo. Tutte le altre informazioni sull'immagine sono memorizzate in Page->Image

Ora dall'oggetto paragraph Voglio accedere alle informazioni image dove il paragrafo ha solo image_id e tutte le altre informazioni sull'immagine sono in Page->Image oggetto.

Quale sarà il modo migliore per accedere a queste informazioni?

Devo passare l'oggetto page in ogni costruttore di paragraph o qualcos'altro?

Inoltre non posso modificare la struttura della classe, poiché è scritta da qualcun altro.

    
posta user160820 11.01.2013 - 11:46
fonte

3 risposte

1

KISS è sempre l'approccio migliore:

foreach($page->paragraphs as $paragraph)
    foreach($paragraph->image_ids as $image_id)
        $image = $page->images[$image_id]

Ma se vuoi qualcosa di un po 'più speciale, un delegato può aiutarti a fornire la funzionalità "mancante" richiesta e per il quale php 5.3 ha reso le cose super facili grazie a un po' di magia.

<?php

class PageDelegate
{
    private $page;

    public function construct($page)
    {
        $this->page = $page;
    }

    /* The magic delegating methods __call, __set and __get */
    public  function __call($name, $args)
    {
        if (method_exists($this->page, $name))
            return call_user_func_array(array($this->page, $name), $args);
        // you may require some conversion to valid method name
        // like converting - to _ etc. this should be kept in mind.
        if (array_has_key($this->images, $name))
            return $this->images[$name]; // note how this becomes $this->page->images[$name]
        throw BadMethodCallException("Method $name does not exist");
    }
    public function __get($name)
    {
        if (property_exists($this->page, $name))
            return $this->page->{$name};
        throw InvalidArgumentException("Property $name does not exist");
    }
    public function __set($name, $value)
    {
        if (property_exists($this->page, $name))
            $this->page->{$name} = $value;
        else
            throw InvalidArgumentException("Property $name does not exist");
    }

    // And perhaps something to help out with common tasks
    public function images_in_paragraph($paragraph) 
    {
        $images = array();
        foreach($paragraph->image_ids as $image_id)
            // Note how this becomes $this-page->images[$image_id];
            $images[] = $this->{$image_id}();
        // return the collection of image objects in the paragraph
        return $images;
    }
}

Usando solo i 3 metodi magici __call, __set e __get stiamo delegando efficacemente a tutti i membri dell'istanza di Page e ora puoi chiamare le immagini usando il loro image id come metodo. Se ci sono delle funzionalità della Pagina che vuoi sovrascrivere, semplicemente aggiungendo la funzione verrebbe visto essere chiamato al posto del nostro metodo magico __call per fare le tue offerte. Ora non importa che non puoi cambiare la loro fonte, puoi comunque fare ciò che ti piace. =)

L'implementazione sarebbe quindi simile a questa forse

$page = new PageDelegate($page);
foreach($page->paragraphs as $paragraph)
    foreach($page->images_in_paragraph($paragraph) as $image)
        echo "<img title=\"$image->title\" src=\"$image->src\">";

nJoy!

    
risposta data 14.01.2013 - 05:50
fonte
0

L'oggetto paragrafo deve avere un meccanismo per sapere da dove provengono i dati dell'immagine.

Supponendo che un paragrafo non possa esistere in modo isolato ma solo come parte di una pagina, non c'è nulla di male nell'aggiungere la pagina proprietaria come parametro costruttore per ogni paragrafo per fornire questo.

    
risposta data 11.01.2013 - 14:42
fonte
0

Penso che il commento di rvcoutinho sia in linea con la risposta corretta. La classe di pagina o una 3a classe (decoratore / mediatore) dovrebbero essere responsabili della fornitura dell'immagine al paragrafo. Tutte le immagini richieste dal paragrafo devono essere passate al paragrafo.

Se non ti piacciono queste opzioni, penserei che passare la raccolta di immagini al paragrafo sia di gran lunga preferibile rispetto al passaggio della classe di pagine. Dopo tutto, se si pensa al problema concettualmente, le pagine contengono paragrafi. I paragrafi non contengono o non conoscono pagine.

    
risposta data 14.01.2013 - 16:18
fonte

Leggi altre domande sui tag