首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__autoload:逃逸ClassName

__autoload:逃逸ClassName
EN

Stack Overflow用户
提问于 2012-06-18 09:18:46
回答 4查看 113关注 0票数 1

这是我第一次创建一个frontController,我遇到了一些小问题。

首先让我给您一个印象:当我在浏览器中打开http://mysite.com/test时,服务器将使用GET参数$controller (test)调用index.php。这是由一个.htaccess完成的。在index.php中,将创建类$controller的一个实例。为此,我使用了PHP的__autoload函数。代码看起来如下:

代码语言:javascript
复制
$controller = $_GET["controller"];

function __autoload($controller)
{
    include("controllers/$controller.php");

    if(!class_exists($controller, false))
    {
        eval
        ('
            class '. $controller . '
            {
                public function __construct()
                {
                    include("404.html");
                    exit();
                }
            }
        ');
    }
}


$application = new $controller;

当您查看我提供的代码时,您可能已经注意到了其中的eval()。我使用它来避免$controller类不存在时的致命错误,并显示一个404而不是它。

和这里开始的乐趣:当有人进入一个url时,就像

http://mysite.com/ImATroll!:D

将会有

解析错误:语法错误,意外的'!‘

还有..。

致命错误:未找到类'ImATroll!:D‘

,所以问题是:,我怎么能抓到这个?如何转义$controller变量,使其只包含类名所允许的字符?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-18 09:32:32

实际上,您可以从自动加载函数中抛出一个异常(p.s.:使用寄存器 )。

此异常是可捕捉的,因此您可以提供“默认”功能。

到目前为止,这是一种更好的方法,但是如果您坚持要创建这个假控制器,则应该使用class_alias。

票数 1
EN

Stack Overflow用户

发布于 2012-06-18 09:22:58

我只需要简单地将放到中-- eval部分,并在该部分直接重定向到404。

或者构建一个(非动态的) 404- ContentNotFoundController (如果需要的话),只需使用/生成(当类名不存在时)。

票数 4
EN

Stack Overflow用户

发布于 2012-06-18 09:23:43

为什么不在调用new $controller;之前尝试new $controller; (class_exists将调用autoload函数),如果为false,则包含(‘404.html’);

代码语言:javascript
复制
function __autoload($classname){

   $file = "controllers/$classname.php";
   if(is_file($file))
    include_once($file);

}

..。但是要注意安全问题--例如传入?控制器=../htpasswd。您应该通过删除所有非字母数字字符类$classname = preg_replace('/[^A-Za-z0-9]/', '', $classname);来净化类名。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11079952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档