Passando nomi di classi o oggetti?

0

Ho un'istruzione switch

    switch ( $id ) {
        case 'abc':    return 'Animal';
        case 'xyz':    return 'Human';
                    //many more
                    }

Sto restituendo i nomi delle classi e li uso per chiamare alcune delle loro funzioni statiche usando call_user_func (). Invece posso anche creare un oggetto di quella classe, restituirlo e quindi chiamare la funzione statica da quell'oggetto come $ object :: method ($ param)

    switch ( $id ) {
        case 'abc':    return new Animal;
        case 'xyz':    return new Human;
                    //many more
                    }

In che modo è efficiente? Per rendere questa domanda più ampia: ho classi che hanno per lo più tutti i metodi statici in questo momento, metterle in classi è una specie di idea di raggruppamento qui (per esempio la struttura della tabella DB di Animal è data dalla classe Animal e così per la classe Human). Ho bisogno di accedere a molte funzioni da queste classi, quindi lo switch deve darmi accesso alla classe

    
posta nischayn22 14.06.2012 - 19:02
fonte

3 risposte

4

Ovviamente, chiamare inutilmente un costruttore per il solo motivo di chiamare un metodo statico è meno efficiente. Apparentemente c'è una sorta di meta-classe che incapsula il comportamento statico di Animal / Human o forse il metodo statico ha la posizione sbagliata. La situazione produce un errore di modellazione / progettazione, ma non c'è abbastanza contesto per determinare quale.

    
risposta data 14.06.2012 - 19:15
fonte
1

Assolutamente andare con il percorso di chiamata statico. Costruire un oggetto al solo scopo di chiamare un metodo statico su di esso è uno spreco, ma dal momento che hai deciso di utilizzare PHP, non dovresti preoccuparti comunque dell'ottimizzazione a questo livello. Ciò di cui dovresti preoccuparti sono gli effetti collaterali: in PHP non esiste una regola che dica che un costruttore non può avere effetti collaterali e, in tal caso, può morderti gravemente. Ad esempio, potresti costruire un oggetto e il costruttore deve eseguire l'output sul client e poi provare a reindirizzare, ma header() fallisce perché hai già inviato l'output.

Come soluzione ancora migliore, vedi se riesci a trovare un design adeguato. Riesco a vedere due percorsi sensati che puoi prendere qui:

a) Avvolgi ciascuno dei metodi statici che vuoi chiamare in una funzione libera e passa (a partire da PHP 5.3, puoi usare funzioni anonime per questo, che, a proposito, forniscono anche un modo pulito per controllare lo scope variabile) oltre le normali regole a due livelli).

b) Avvolgere ciascuno dei metodi statici in un metodo non statico di una classe che implementa un'interfaccia comune che definisce questo metodo; restituire le istanze tramite l'interfaccia e chiamare il metodo dell'interfaccia. Questo è essenzialmente il modello di fabbrica di base con le classi di comportamento.

    
risposta data 14.06.2012 - 19:30
fonte
1

puoi fare i metodi di fabbrica in PHP?

Interfrace IMethodsINeedToCall()
    Method1INeed();
    Method2INeed();

and your Animal / Human classes implement the interface:

Class Animal:IMethodsINeedToCall
    ...implement methods

Class Human:IMethodsINeedToCall
    ...implement methods    

IMethodsINeedToCall animalResults = CallSwitchStatementAndRetrunObject('animal');

animalResults.Method1INeed();
animalResults.Method2INeed();

IMethodsINeedToCall humanResults = CallSwitchStatementAndRetrunObject('human');

humanResults.Method1INeed();
humanResults.Method2INeed();

Non sono sicuro che PHP supporti questa metodologia ... Sono sicuro che lo fa in una certa misura, ma sembra un approccio pulito.

    
risposta data 14.06.2012 - 19:31
fonte

Leggi altre domande sui tag