speedphp框架环境要求php5
SpeedPHP 从 3.x 版本开始就把 PHP 5.0 写进了最低环境要求里。框架这不是环境随便填的数字,是框架框架源码里用到了大量 PHP 5 才有的语言特性。你拿 PHP 4 去跑,环境连入口文件都过不去。框架
先说最直接的环境:__construct() 这个魔术方法。PHP 4 里构造函数得跟类名同名,框架SpeedPHP 的环境控制器基类、模型基类全部用的框架是 __construct()。PHP 4 解析器看到这个方法名,环境根本不认识,框架直接当普通方法处理,环境继承链上的框架初始化逻辑全部失效。你 new 一个控制器出来,环境什么都不会发生。框架
再往深了说,SpeedPHP 的数据库抽象层用了 PDO。PDO 扩展在 PHP 5.1 才默认捆绑,PHP 5.0 需要手动编译进去。框架的 spModel 类里,连接数据库那一段代码直接调用 new PDO(),PHP 4 下面这个类根本不存在。你配好数据库参数,页面一刷新就是 fatal error。
还有 SP_VERSION 这个常量。SpeedPHP 在入口文件里会做一次版本检测,代码大概长这样:
if (version_compare(PHP_VERSION, '5.0.0', '<')) { exit('SpeedPHP requires PHP 5.0 or higher'); } 这行判断不是摆设。我见过有人把 SpeedPHP 丢到老旧的虚拟主机上,PHP 版本还是 4.4.x,访问首页直接弹出一行白底黑字,连框架的报错页面都加载不出来。因为报错页面本身也是 PHP 5 语法写的。
实际部署中还有个坑:PHP 5.0 到 5.2 这几个小版本,SpeedPHP 虽然标称支持,但某些功能会出问题。比如 json_encode 和 json_decode,PHP 5.2 才默认开启。SpeedPHP 的 AJAX 返回、API 接口层大量依赖这两个函数。你跑在 5.0 或 5.1 上,得手动装 json 扩展,否则所有返回 JSON 的接口全部空白。
我自己的建议是:别卡着 5.0 这条线用。SpeedPHP 官方文档虽然写着 PHP 5.0+,但实际开发中至少上 PHP 5.3。5.3 引入了命名空间,SpeedPHP 后期的一些扩展类库用到了这个特性。你非要用 5.0,框架核心能跑,但周边生态基本残废。
另外提一句 __autoload。SpeedPHP 的类自动加载机制依赖 spl_autoload_register,这个函数在 PHP 5.1.2 之后才稳定。5.0 版本里虽然有,但行为不一致,某些情况下会重复加载同一个类文件,直接导致 Cannot redeclare class 报错。你改都改不动,因为那是 C 层面的实现差异。
数据库这块再说细一点。SpeedPHP 的 spModel 里有个方法叫 getFields(),用来获取表结构。它内部用了 PDO::getColumnMeta(),这个方法的支持程度跟 PHP 版本和 PDO 驱动版本都有关。PHP 5.0 配 MySQL 4.1 的 PDO 驱动,getColumnMeta() 返回的数据结构跟 5.3 下面完全不一样。框架拿到错误的数据格式,字段映射直接乱掉。你插入一条记录,字段值全串位。
所以结论很直白:SpeedPHP 的环境要求写 PHP 5,是底线,不是推荐值。你要真拿 PHP 5.0 去跑,核心功能勉强能动,但稍微上点规模的项目,各种诡异问题会把你拖死。直接上 PHP 5.3 或 5.4,省掉至少一半的调试时间。老虚拟主机不给升级?换主机。别跟版本较劲。