【发布时间】:2015-05-27 11:17:03
【问题描述】:
我的 php.ini 中有一个 MVC 结构。
我使用自动加载来初始化正确的控制器。
这是我的 index.php 的一个非常简单的版本:
<?php
spl_autoload_extensions('.class.php');
spl_autoload_register();
$controller = strtolower($_GET["controller"]);
$action = strtolower($_GET["action"]);
$obj = new $controller();
$obj->{$action}();
假设用户加载了www.example.com/Page/View。 Apache 会将其重写为www.example.com?controller=Page&action=View。然后当 php 调用$obj = new $controller(); 时,它会尝试在与文件相同的目录中找到page.class.php(显然在我的应用程序中,文件结构不是那么简单,有命名空间等......),然后加载Page 类里面并执行Page->View();。
现在,假设用户打错字并尝试加载www.example.com/Pagr/View。理想情况下,他应该得到 404 标头响应。但是在当前的实现中,当 php 无法自动加载 pagr.class.php 时,它只会抛出一个 Fatal error。
如何防止此错误发生?我已经进行了一些研究,但我无法在new 调用之前检查类是否可以自动加载。
【问题讨论】:
-
使用 try-catch 块怎么样?尝试{ $obj = new $controller(); } catch(ExceptionThrownOnNotClassFound){ //创建 404 响应 }
-
无法捕获致命错误。
-
我只是想在这里猜测一下。也许用 class_exists 检查类 $obj 是否存在可以帮助你
-
只是说:不要盲目使用来自 $_GET 的输入值。用户可能会制作一些令人讨厌的网址,这些网址可能会带来意想不到的危险后果。
标签: php oop autoload spl-autoload-register