X3.5 版本后端兼容需要重点检查的点
- X3.5 测试站建议在开启
$_config['deprecated'] = 1;的情况下测试插件/模板,以完整测试出所有被抛弃特性。 - 不允许数据表使用
pre_common、pre_connect、pre_forum、pre_home、pre_portal、pre_security、pre_ucenter、pre_uc等系统保留数据表前缀,不允许在系统表内添加任何自定义字段。 - 不允许自建表不兼容 LSP (选择和
discuz_table.php内方法相同的名字但不能实现完全相同的功能)。不允许依赖 table 表的兼容性命名。 - X3.5 采用
<!DOCTYPE html>作为头部,并且上线了新的 PC 端、触屏版模板,声称支持 X3.5 的前后端模板如果没有在 X3.5 首个发布版本上测试过(上次提交审核日期早于首个发布版本发布日期),则必须在首个发布版本或者更高版本上按照全新模板测试流程测试一次,因为可能会出现细微的布局错乱,甚至功能异常(但邮件等特殊功能允许不使用 HTML5 标准头)。 - 不允许存在
MAGIC_QUOTES_GPC常量或者 PHP 自带的魔术引号相关函数以及相关函数的封装(如 uc_stripslashes 函数)。 - 不支持 HTTPS 和 HTTP 自适应,写带协议头的链接请求站内资源,以 HTTP 方式请求站外资源,上述任意一种行为均不允许,但如果只是输入框可以允许显示
http://。 - 存储 IP 字段小于
varchar(55),使用ip2long、long2ip等函数或非规范正则(规范的很长很长)处理 IP ,存储 IP 未同时存储端口号均不允许。 $_G['gp_xxx']的取值方式不允许使用。- 使用 array_key_exists 判断
$_G以及$_G['example']的存在性是不允许的。 - 裸调用
jQuery.noconflict()(不带声明)或者没有正确处理自带第三方组件与系统组件关系的是不允许的。 - 如果一个 Hook 是某个功能关闭时不应该执行的,那么 Hook 代码需要自己判断功能是否关闭。另外有些逻辑可能需要判断功能开关状态,如果关闭时不需要执行需要手动增加判断。
pre_common_member_log以及pre_forum_threadlog等归属漫游、云平台的数据表已经删除,如果插件或模板依赖这个数据表需要自行修改实现,不允许出现。- 内容标题字段小于 255 字、TID 使用 mediumint 等不符合 X3.5 数据库变更的设计(具体看下 X3.5 上
install.sql和uc.sql的变更记录)、按照md5(md5($password).$salt)解析或者覆盖用户密码等按照 X3.4 或者更老版本设计,不允许 X3.5 的组件实现无法兼容 X3.5 版本。
X3.5 需支持 PHP 8 情况下后端兼容需要重点检查的点
- 在数组中取得任何一个值之前,除非能够保证此值一定为数组(判定位置执行时能明确知晓数组定义),否则应该视情况使用
is_array($arr)或者array_key_exists('example', $arr)判断这个数组或者这个值是否存在,如果未做判定直接使用在 PHP 8 下是致命错误,不允许出现此情况。(此问题的重灾区主要是count()、in_array()、array_key_exists()、implode(),前端后端都很严重。另外数组并非无限延伸,如只是声明了$arr = array();,则$arr['test'] = null)。 - 在数组中不使用引号,如
$arr[test],之前版本可以纠正为$arr['test']的正确写法,在 PHP 8 下是致命错误,不允许出现此情况(这个虽说放在了第二条,但是从主程序来看量级远远大于第一条,而且这种东西存在传染性,因此确实需要关注,尤其是看着比较乱的 PHP 代码)。 - 调用 PHP 自带的函数要严格按照 PHP 帮助文档 内的函数定义准备参数,如果数据类型不对或者数值不对,会报 TypeError 或 ValueError 异常。如
substr('foo', []);会在 PHP 8 下产生致命错误。更多例子请见 这篇英文文档 ,不允许出现此类情况。 create_function()、each()以及dl()等函数已被删除,不允许出现此类函数调用。- 未定义
static的类方法或类常量使用->取值在 PHP 8 下是致命错误,不允许出现此类情况。 @不能抑制致命错误,看到@要判断是否屏蔽的是 PHP 8 下的致命错误(比如 TypeError 或 ValueError 异常),不允许出现此类情况。- 数组取值不允许使用花括号,如
$arr{0},在 PHP 8 下是致命错误,不允许出现此类情况。 - PHP 8.1 不允许对 $_GLOBAL 内的内容以数组的形式进行写操作(如
$_GLOBAL['EXAMPLE']['ARRAY'] = array();),不允许出现此类情况。
X3.5 版本前端兼容需要重点检查的点
- X3.5 开始在前端使用字体图标,直接沿用 X3.4 时代的图标写法可能会造成新老图标重叠在一起(如面包屑导航开头的小房子图标,右上角用户名前面的人头图标),出现概率极高,开发者若不想使用系统定义的字体图标则需额外在样式里添加
text-indent或line-height(可参考旧版本),需额外注意此处是否做了兼容处理,不允许不做兼容或发现重叠。 - X3.5 的帖子列表等部分区域图标也从原来的嵌入 HTML 的 IMG 图标变为通过 CSS 嵌入的字体图标,模板开发者可以自行用 CSS 覆盖掉原有行为,不再需要修改 HTML 部分,不允许此处有样式错乱。
- X3.5 的“发帖”,“回帖”等按钮不再使用过去的带文字图片形式,而是直接嵌入文本且长度可变,若开发者未适配则会造成图片上重叠文字,或者尺寸大小不匹配等的现象吗,此外“发帖”按钮的文字根据 Discuz! 历史版本数据及语言包等情况已变更为“发新帖”,不允许此处有样式错乱
- X3.5 的搜索框位置(含搜索框本体,搜索框的下拉菜单,搜索功能所在页),右上角 DIY 小弹窗, DIY 模式下的个人主页右上角装扮空间按钮,主导航的下拉菜单,做了较大幅度的重新绘制和 CSS 调整,若开发者未适配可能会出现错位,样式冲突等问题,不允许此处有样式错乱。
X3.5 需支持 PHP 8 情况下前端兼容需要重点检查的点
- 模板中的带数组的 BLOCK 需要符合版本,
<!--{block slist[user]}-->不兼容 PHP 8,<!--{block slist['user']}-->不兼容 X3.4 及更低版本,不允许使用错误。 - 关于上一节提到的未定义的数组键的问题,可以看一下 这个 Commit ,如果模板是从 X3.4 升级上来的,可能会在这些地方犯错误,这个位置绝大多数时候不影响模板兼容低版本,不允许使用错误。
- echo / eval / date / avatar 的实质是 PHP 代码执行,后续跟的内容需要符合上一节的内容,不允许出现不合规情况(如
echo count($null[test])),这个位置不影响模板兼容低版本。 <!--{avatar($_G[uid],small,true)}-->、<!--{date($colletion[lastposttime])}-->或类似写法是不允许的,正确写法为<!--{avatar($_G['uid'], 'small', true)}-->、<!--{date($colletion['lastposttime'])}-->,这个位置不影响模板兼容低版本。- HOOK 内的数组也需要加上引号,如
<!--{hook/forumdisplay_subforum_extra $sub[fid]}-->要改为<!--{hook/forumdisplay_subforum_extra $sub['fid']}-->,这个位置不影响模板兼容低版本,不允许使用错误。 $_G[home_tpl_xxx如果没带引号的基本上都是整个有问题的不允许使用。直接加括号和引号是不正确的,正确写法请参考 X3.5 代码,这个位置不影响模板兼容低版本。
X3.5 版本其他相关规范性内容
- 不允许存在未做 HTML5 支持的 Flash 版本组件。
- 新审核的插件或者模板走完测试流程后,应到
管理中心 - 工具 - 运行记录 - 系统记录 - 系统错误页面的错误日志处查看是否新增了错误日志,如新增错误日志一般是 Ajax 请求触发了 Fatal Error ,如果确认 Fatal Error 和插件有关则此插件/模板不符合规范。 - 建议搭建 PHP 8 & PHP 7.4 + MySQL 8 的测试环境,可以使用宝塔面板或者 PHP For Windows / MySQL For Windows 快速构建。
