【问题标题】:Unable to use variable variables to execute function in PHP 5.5在 PHP 5.5 中无法使用变量变量来执行函数
【发布时间】:2015-02-27 15:23:09
【问题描述】:

我自己和另一位开发人员都在两个独立的系统(Ubuntu 和 OSX)上安装了 Lamp,出于某种奇怪的原因,我们内部开发的包不再适用于 PHP 5.5(在我的情况下为 5.5.9)

一个特别的领域是:

if (method_exists($this, 'hook_' . __FUNCTION__)) {
    $this->{'hook_' . __FUNCTION__}();
}

上面的代码导致一个错误,指出名为hook_xxx的方法不存在,但是如果我们将代码替换为:

if (method_exists($this, 'hook_' . __FUNCTION__)) {
    call_user_func(array($this, 'hook_' . __FUNCTION__));
}

效果很好。

更糟糕的是,这适用于 PHP 5.4.33..

我刚刚花了 2 天时间研究 PHPBrew 等,试图正确安装 PHP 5.4.33,并认为该解决方案实际上是试图找出它首先失败的原因。

有什么想法吗?

谢谢

加文


我得到的错误是:

Call to undefined method LocalController::hook_index()

我在哪里:

<?php

    class Controller
    {
        public function index() {

            echo 'Parent index called';

            if (method_exists($this, 'hook_' . __FUNCTION__)) {
                $this->{'hook_' . __FUNCTION__}();
            }
        }
    }

    class LocalController extends Controller
    {
        public function hook_index() {

            echo 'Child index called';

        }
    }

它自己的应用程序将加载到Controller中,然后如果存在,它将加载到LocalController中。

这一切在 5.4 上都可以正常工作,或者如果我将其更改为使用 call_user_func,但否则会因上述错误而死。

【问题讨论】:

  • 您得到的确切错误是什么?
  • 适用于我,Mac OS X 运行 PHP 5.5.14。
  • 我想这实际上会有所帮助;)见上文
  • 看起来您在Controller 的上下文中调用$this 上的方法,而hook_index 方法是LocalController 类的成员,而这两个类都不是扩展另一个。也就是说,(Controller) $this 中确实不存在该方法。我错过了什么吗?
  • 我们有一个专有系统,它是一个核心包。我们所有的类都可以通过简单地扩展原始类并在类名前加上 Local 来覆盖。如果需要,这将提供对现有方法的访问。除此之外,我们还提供了在原始之后调用的钩子(即 hook_functionname),它允许您在响应发送回之前进行交互。

标签: php php-5.5


【解决方案1】:

尝试进行字符串连接并分步调用

        $f = 'hook_' . __FUNCTION__;
        print('testing function ' . $f);

        if (method_exists($this, $f)) {
            $this->$f();
        } 
        $this->response->setOutput($this->render());

【讨论】:

  • 这可行,但并不能真正解释为什么我们当前使用的花括号方法不再适用于 PHP 5.5.9。有什么想法吗?
  • PHP 在嵌套操作方面有一些怪癖。一般来说,它不能很好地处理嵌套。它甚至不能做一些功能(array(1,2,3));
  • 编辑:最新版本的 php 可能已经修复了数组问题。总的来说,PHP 不是最符合逻辑设计的语言 :-)
  • 虽然,如果你确实使用大括号,我认为它前面也少了一个 $。例如:$ab = 1;回声 ${'a' 。 'b'};
  • 它似乎只适用于旧版本的$this-&gt;{$variable . '_suffice'}(),但看不到任何关于原因的参考。我们将不得不大规模更新应用程序以更符合您的建议或call_user_fun
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多