2015-04-29 16 views
5

In CF10, desidero accedere a un oggetto Test variabile utilizzando la funzione onMissingMethod nell'oggetto TestHelper, ma viene visualizzato un errore.L'utilizzo di onMissingMethod non può accedere alle variabili dell'oggetto

Test.cfc

component { 

public Any function init(){ 
    instance = { x = 1 }; 
    return this; 
} 

public numeric function getX(){ 

    return instance.x; 

} 

} 

TestHelper.cfc

component { 

public Any function init(){ 
    variables.testObj = new Test(); 
    return this; 
} 

public any function onMissingMethod(required string missingMethodName, required struct missingMethodArguments){ 

    var func = variables.testObj[ arguments.missingMethodName ]; 
    return func(argumentCollection = arguments.missingMethodArguments); 

} 

} 

Chiamando l'oggetto

obj = new TestHelper(); 
writeOutput(obj.getX()); //Element INSTANCE.X is undefined in VARIABLES 

In CF10, questo mi dà un errore che elemento di X non è definito in caso. Non sembra riconoscere l'istanza della variabile. Potrei definire esplicitamente la funzione getX in TestHelper, ma speravo di poter utilizzare la funzione onMissingMethod.

Sto fraintendendo come dovrebbe funzionare onMissingMethod? FWIW, il codice funziona in Railo.

risposta

2

Se ho compreso il problema, sono sorpreso che questo codice funzioni su Railo. Non penso che dovrebbe

Il problema è con questo codice:

var func = variables.testObj[ arguments.missingMethodName ]; 
return func(argumentCollection = arguments.missingMethodArguments); 

Qui si sta tirando la funzione getX() fuori variables.testObj, e l'esecuzione nel contesto del vostro TestHelper esempio. E quell'oggetto non ha un `variables.x. Quindi l'errore.

È necessario inserire il riferimento func in variables.testObj, non estrarre getX da esso. Quindi, in questo modo:

var variables.testObj.func = variables.testObj[ arguments.missingMethodName ]; 
return variables.testObj.func(argumentCollection = arguments.missingMethodArguments); 

In questo modo si sta eseguendo func() (il proxy per getX()) nel contesto corretto, quindi vedrete variabales.x.

fronte di questa situazione, non c'è modo questo codice dovrebbe funzionare su Railo (basato sulle informazioni che ci hai fornito di essere tutte le informazioni pertinenti, comunque).

+0

Adam, hai ragione (come al solito). Quando l'ho provato su Railo, in realtà stavo facendo 'return variables.testObj [arguments.missingMethodName] (argumentCollection = arguments.missingMethodArguments);'. Ma a CF10 non piace questo codice, quindi ho pensato di poter assegnare il metodo a una variabile func e quindi chiamarlo sulla riga successiva. Non mi rendevo conto che fare così toglie il metodo dal suo contesto. Grazie per il chiarimento. Molto apprezzato. – user2943775

+0

Nessun problema. Sì, abbiamo cercato di convincere Adobe ad aggiungere la sintassi, ma non l'avrebbero fatto. Esiste 'invoke()', che potrebbe essere d'aiuto? https://wikidocs.adobe.com/wiki/display/coldfusionen/Invoke –