【发布时间】: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),它允许您在响应发送回之前进行交互。