Le funzioni getter "magiche" devono essere utilizzate per valori calcolati dinamicamente o solo per proprietà esistenti?

1

Ad esempio, se avessi una classe Customer e volessi ottenere tutti gli ordini da loro. Sarebbe meglio fare:

class Customer{
    public function getOrders(){
        return results from db query
    }
}

...

foreach($customer->getOrders()){}

o

class Customer{
    private function getOrders(){
        return results from db query
    }

    public function __get($attribute){
        if($attribute === 'orders'){
            return $this->getOrders();
        }
    }
}

...

foreach($customer->orders){}

Il primo non è così gonfio, ma è bello poterlo accedere come se fosse una proprietà piuttosto che con getOrders() .

    
posta Cal7 04.04.2016 - 18:38
fonte

1 risposta

1

Il metodo magico __get è completamente corretto, assicurati di accoppiarlo con @property (se vuoi anche una magia __set ) o @property-read phpDoc annotazione in modo che i consumatori della tua classe sappiano che cosa possono aspettarsi dall'API pubblica della tua classe.

La combinazione di PHP dei metodi __get e __set e l'annotazione @property è una versione povera degli attributi di C # e, proprio come in C #, non sono cattivi finché si visualizza nell'API del classe ciò che la classe effettivamente offre (in C # non è necessario l'annotazione per questo, perché la lingua supporta gli attributi per impostazione predefinita).

Personalmente non uso affatto magic __set , ma ho utilizzato __get in gran parte e non ho mai avuto problemi con il metodo.

    
risposta data 04.04.2016 - 19:13
fonte