【问题标题】:Call a non-global variable from a function?从函数调用非全局变量?
【发布时间】:2012-07-17 02:53:49
【问题描述】:

在 Joomla! 的开发过程中!插件,我遇到了一些非常有趣的东西。其中一个事件没有返回值,但它从函数内部调用变量。先前的知识告诉我,只有当变量在函数内部是全局的时,这才应该有效,但调度程序能够从函数外部调用变量。

编辑:我刚刚发现从函数内部访问的变量必须是参数之一!这可能是 func_get_params() 还是 call_user_func()?

调用代码:

$instance = JDispatcher::getInstance();
$instance->trigger(onJoomCalledEvent, array(&$link, $other_params));

插件(sn-p):

class plgMyPlugin extends JPlugin{

    onJoomCalledEvent($link, $other_params){
        $link = "Some Value Here";
        return false;
    }
}

此函数返回 false,但不知何故,应用程序 (Joomla!) 能够提取 $link 的值。这是怎么做到的?

【问题讨论】:

  • 您能否发布指向相关(完整)代码的链接?
  • 执行此操作的实际代码是 Joomla 的一部分,特别是 JDisplatcher 类。我上面添加的“调用代码”是调用插件的组件中的代码。
  • 看起来 JDispatcher 已被弃用。我认为他们试图做的是通过reference 传递$link,以便在被调用函数中对其进行的任何更改也会更改传入的变量。它的传递方式在PHP 5.3 中已弃用。引用必须在函数中声明,而不是在调用时传递值时声明。
  • 我刚刚对参考资料做了一些进一步的阅读,你是对的。正在发生的事情是组件正在声明 $link 变量,并通过将其作为对 onJoomCalledEvent 的引用传递,它可以由插件修改(或在本例中设置)。非常感谢您的帮助!
  • 我从 GitHub 克隆了 repo,这里是已弃用的 JDispatcher 文件。当您尝试使用它时,它会抛出异常。 github.com/joomla/joomla-cms/blob/master/libraries/legacy/… 这似乎是替代品:github.com/joomla/joomla-cms/blob/master/libraries/joomla/event/… 我对 Joomla 不太熟悉,所以我不确定我正在查看的是当前代码还是未来代码。无论哪种方式,您发布的代码中演示的调用时传递引用现在在 PHP 中已被弃用,并将在 PHP 5.3 中引发错误

标签: php function variables joomla global


【解决方案1】:

插件定义是不是像这样:

class plgMyPlugin extends JPlugin{

    onJoomCalledEvent(&$link, $other_params){
        $link = "Some Value Here";
        return false;
    }
}

不是pass by reference。如果它确实是您在上面发布的方式而不是调用时间通过引用传递,它已被弃用并从 PHP 5.3 开始发出警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2015-09-26
    • 2021-05-29
    相关资源
    最近更新 更多