我的代码遇到了奇怪的问题。我有几乎完全相同的代码(我没有提供实际代码b`cuz它是一个有大量动态生成的小型库(选择基于路径路由的类,即框架))。
代码说明:
ClassA 表示当前路线对象。包含控制器,路由字符串等。
ScriptAClassAction 是调度程序,检查路由是否具有执行和运行所有内容所需的所有内容,控制器是否存在$!empty(reflection)
并且控制器中是否存在操作{{1} 1}}。
在我的世界中,如果两个条件都是(并且不是)或者应该触发其他条件,则应该触发父
我在想这可能是PHP中的一个错误,但我对此表示怀疑。有没有人看到我想念@ 1:50 AM的东西?
PHP 5.3.27,启用了xDebug(没有其他扩展名)& 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
答案 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方法的原因。