public static function render($file, $data = null)
    {
        $file_path = dirname(__DIR__) . "/views/{$file}.php";
        // 如果给定文件名不存在或不可读
        if (!is_readable($file_path)) {
            throw new \Exception("找不到模板文件:{$file_path}。");
        }
        // 如果是数组就合并
        if (is_array($data)) {
            array_merge($data);
        }
        extract($data);
        include $file_path;
    }
然后模板中这样使用:
$a = 1;
View::render('home/index', compact('a'));
我不清楚该如何检查是否有安全问题 🥺,小问题就是同名的变量 extract 会冲突。
     1 
                    
                    eason1874      2021-04-01 08:42:37 +08:00    array_merge 那行有用?看得我有点怀疑我对 PHP 的了解了。 
                extract 可以在第二个参数传入 EXTR_SKIP 不覆盖已存在的变量。 模板变量你不该直接传入用户输入,你要先过滤好再传入,所以安全过滤也不在这里过滤。  | 
            
     2 
                    
                    urlk      2021-04-01 09:16:26 +08:00    数组合并了个寂寞 
                 | 
            
     3 
                    
                    wfdaj   OP  | 
            
     4 
                    
                    wfdaj   OP @shenjinpeng 应该把代码放到 github 上,起名是 “php 新手常见错误用法实例” 😂 
                 | 
            
     5 
                    
                    Rache1      2021-04-01 09:20:23 +08:00 
                    
                    单个值 array_merge 的作用等同于 array_values 
                 | 
            
     7 
                    
                    imdong      2021-04-01 09:36:13 +08:00 
                    
                    @faqqcn 这个还真注意过,看了下文档“数字索引”确实会重新排。 
                不过,需要 extract 的大概率是关联数组了,所以真的就 array_merge 了个寂寞。 而且就算索引合并了,由于调用不是引用的,而返回值没有接收。 寂寞时的爱,到底爱的该不该。  | 
            
     8 
                    
                    imdong      2021-04-01 09:43:39 +08:00 
                    
                    另外补充回答楼主的问题: 
                第一个漏洞:如果构造出 $file = "../../upload/image" 并且恰巧这个目录是上传目录,就有可能会出现 include 用户上传的文件,而导致上传后门被利用。 然后 extract 这个的话,应该问题不大,简单来说就是这么搞。  |