【问题标题】:Using onMissingMethod cannot access object variables使用 onMissingMethod 无法访问对象变量
【发布时间】:2015-07-09 04:19:44
【问题描述】:

在 CF10 中,我想使用 TestHelper 对象中的 onMissingMethod 函数访问变量 Test 对象,但出现错误。

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 );

}

}

调用对象

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

在 CF10 中,这给了我一个错误,即元素 X 在实例中未定义。它似乎无法识别变量实例。我可以在 TestHelper 中显式定义 getX 函数,但我希望我可以使用 onMissingMethod 函数。

我是否误解了 onMissingMethod 应该如何在这里工作? FWIW,代码在 Railo 中工作。

【问题讨论】:

    标签: coldfusion coldfusion-10 railo


    【解决方案1】:

    如果我了解您的问题,我很惊讶这段代码在 Railo 上运行。我认为不应该。

    问题在于这段代码:

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

    在这里,您将函数 getX()variables.testObj 中提取出来,并在您的 TestHelper 实例的上下文中运行它。并且该对象没有`variables.x。因此出现错误。

    您需要将您的func 引用放入variables.testObj,而不是将getX 从中拉出。像这样:

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

    这样你在正确的上下文中运行func()(你的代理到getX()),所以它会看到variabales.x.

    鉴于这种情况,这段代码不可能在 Railo 上运行(无论如何,根据你提供给我们的所有相关信息)。

    【讨论】:

    • 亚当,你是对的(像往常一样)。当我在 Railo 中测试它时,我实际上是在做return variables.testObj[ arguments.missingMethodName ] ( argumentCollection = arguments.missingMethodArguments );。但是 CF10 不喜欢这段代码,所以我想我可以将方法分配给一个变量 func,然后在下一行调用它。我没有意识到这样做会使该方法脱离其上下文。感谢您的澄清。非常感谢。
    • 没有问题。是的,我们试图让 Adob​​e 添加该语法,但他们不会。不过有invoke(),这可能有帮助吗? wikidocs.adobe.com/wiki/display/coldfusionen/Invoke
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2012-04-02
    • 1970-01-01
    • 2013-04-29
    • 2016-12-27
    相关资源
    最近更新 更多