答案 0 :(得分:6)
答案 1 :(得分:4)
如果您的类中的方法使用exit
处理静态资产,那么解决方案就像将exit
替换为return false
一样简单,并让该方法的调用者只返回方法在全球范围内。
所以如果你的班级看起来像这样......
class Router
{
public function handleRequest($uri)
{
if (is_file($this->docRoot . $uri->path)) {
exit; // static file found
} else {
// handle as normal route
}
}
}
只需将exit
替换为return false
...
return false; // static file found
然后,如果你的index.php
有类似的功能......
$router = new Router($docRoot);
$router->handleRequest($_SERVER['REQUEST_URI']);
只需添加handleRequest
方法的返回面前,就像这样......
return $router->handleRequest($_SERVER['REQUEST_URI']);
这应该对您的框架设计产生最小的副作用,因为您可以看到只需要很少的代码和重构,因为从脚本的全局作用域返回只在PHP中有一个副作用(因为它返回调用脚本的值,即如果您使用include
/ require
作为赋值中的表达式)。在您的情况下,如果index.php
是调用脚本,那么您只需在该方法的前面添加return
就无需担心。
当然,一旦返回,脚本的其余部分将不会继续,因此请确保它是index.php中的最后一个语句。您甚至可以将返回值分配给临时值,如果需要逻辑,则可以稍后返回....
$router = new Router($docRoot);
if ($router->handleRequest($_SERVER['REQUEST_URI'])) {
/* if you need to do anything else here ... */
} else {
return false; // otherwise you can return false for static here
}
一般来说,我会说从函数/方法内部调用exit
几乎永远不会。它使您的类更难以测试和调试,并且实际上没有其他选择,例如抛出异常,或者只是从方法返回,并让调用者处理失败场景优雅。
答案 2 :(得分:0)
无法使用register_shutdown_function或auto_append_file设置来处理吗?不太好,但也许可以做到这一点。