php框架本质是手动编写入口控制、路由分发和功能封装代码,需配置web服务器将请求统一转发至index.php,用parse_url和explode实现简易路由,按约定映射控制器与方法,并通过spl_autoload_register加载类文件。

PHP 本身不提供“框架”这个东西,所谓“快速搭建基础框架”,本质是控制请求入口、组织路由、封装常用功能——不是安装某个包,而是写几段关键代码,把散装 PHP 拎起来。
从 index.php 开始接管所有请求
Web 服务器(如 nginx 或 apache)必须把所有非静态资源请求都转给 index.php,这是现代 PHP 框架的起点。Nginx 配置里要加 try_files $uri $uri/ /index.php?$query_string;;Apache 则依赖 .htaccess 中的 RewriteRule ^(.*)$ index.php [QSA,L]。漏掉这步,$_SERVER['REQUEST_URI'] 拿不到真实路径,路由就全崩。
- 检查
phpinfo()是否显示mod_rewrite已启用(Apache) - 用
var_dump($_SERVER['REQUEST_URI']);在index.php里验证是否捕获到带路径的请求 - 静态文件(CSS/js/图片)建议放在
public/目录下,并让 Web 服务器直接服务该目录,别走 PHP
用 parse_url() 和 explode() 做最简路由分发
不用第三方库也能实现控制器+方法映射。核心逻辑就是解析 URL 路径,按约定拆出模块、操作,再用 is_callable() 校验后调用。比如访问 /user/list,就尝试调用 UserController::list()。
- 约定路径第一段为控制器名(首字母大写 + Controller 后缀),第二段为方法名(小写)
-
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);先取干净路径,避免 querystring 干扰 - 用
array_filter(explode('/', $path))得到非空路径片段,比trim($path, '/')更稳妥 - 没匹配到路由时,统一返回 404 并设置
http_response_code(404),否则搜索引擎会当 200 收录空页
用 __autoload() 或手动 require_once 加载类文件
PHP 7.2+ 已废弃 __autoload(),新手直接用 spl_autoload_register() 更安全。规则越简单越好:类名 UserController 对应文件 app/Controller/UserController.php,路径拼接用 str_replace('', '/', $class) . '.php' 即可兼容命名空间。
立即学习“PHP免费学习笔记(深入)”;
- 别在 autoload 里做复杂逻辑,比如数据库连接或配置加载——它只负责“找到并包含文件”
- 如果不用命名空间,类名和文件名必须严格一致,大小写敏感(linux 下尤其注意)
- 早期框架常用
require_once __DIR__ . '/app/Controller/' . $controller . '.php';,虽土但零依赖,适合第一天跑通
用 $_POST、$_GET 封装成 Request 类时注意过滤时机
新手常把 htmlspecialchars() 或 filter_input() 塞进构造函数,结果模板里重复转义。正确做法是“读取即过滤”,即在 Request::get('name') 里做,而不是存进属性时就处理。
-
filter_input(INPUT_GET, 'id', FILTER_VALIDATE_int)比(int)$_GET['id']更可靠,能区分 0 和缺失 - 表单提交的字符串值,
trim()应该在获取时做,不是在入库前才做 - 上传文件信息在
$_FILES,不能混进$_POST处理逻辑,得单独抽一个File方法
真正卡住新手的往往不是语法,而是 Web 服务器配置、URL 重写生效与否、文件路径大小写、以及“以为自己写了框架,其实只是把 require 写整齐了”。先跑通一个 /hello 输出 “Hello World”,再加第二层抽象——多一层封装,就多一个可能出错的环节。