PHP代码或bug的问题

时间:2013-08-25 00:52:12

标签: php

我的代码遇到了奇怪的问题。我有几乎完全相同的代码(我没有提供实际代码b`cuz它是一个有大量动态生成的小型库(选择基于路径路由的类,即框架))。

代码说明:

ClassA 表示当前路线对象。包含控制器,路由字符串等。

ScriptAClassAction 是调度程序,检查路由是否具有执行和运行所有内容所需的所有内容,控制器是否存在$!empty(reflection)并且控制器中是否存在操作{{1} 1}}。

在我的世界中,如果两个条件都是(并且不是)或者应该触发其他条件,则应该触发 ,这将检查哪些检查失败。在执行时,我看到第一次检查通过(我认为它是PHP中的一个错误),之后 else 被触发,然后第二次如果。< / p>

我在想这可能是PHP中的一个错误,但我对此表示怀疑。有没有人看到我想念@ 1:50 AM的东西?

PHP 5.3.27,启用了xDebug(没有其他扩展名)&amp; Apache 2.2.25(我相信Apache在这里无关紧要但是......),Windows 7 x86家庭高级版

ClassA.php

$reflection->hasMethod('hello')

ScriptAClassAction.php

class A
{
    public function init()
    {
        print 'Init called';
    }

    public function preDispatch()
    {
        print 'Predispatch called';
    }

    public function indexAction()
    {
        print 'Hello world';
    }

    public function postDispatch()
    {
        print "Post dispatch";
    }
}

**输出**

  

Init称为Predispatch,称为Postdospatch,称为Supplied class   没有礼貌,也没有问候你:D

1 个答案:

答案 0 :(得分:2)

if语句中添加括号可以解决问题。此外,您不必测试$reflection变量是否为空。它永远是一个实例。

与@traq提到的一样,最好创建接口来识别具有某些行为的类。

interface DispatchAware {
    public function preDispatch();
    public function postDispatch();
}

class A implements DispatchAware { ... }

现在您不必检查可能存在的每种方法。当类实现接口时,你会知道它存在。

您的调度代码现在看起来像:

$action = 'indexAction';

$a = new A();

if ($a instanceof DispatchAware) {
    $a->preDispatch();
}

try {
    $r = new ReflectionClass($a);
    $method = $r->getMethod($action);
    $method->invoke($a, $request, $response);
} catch (Exception $e) {
    methodNotFoundError();
}

if ($a instanceof DispatchAware) {
    $a->postDispatch();
}

我还删除了init()方法。原因是控制器类型对象通常不需要保持状态。这就是$request$response作为参数传递给action方法的原因。

相关问题