·设为首页收藏本站📧邮箱修改🎁免费下载专区🔐设置/修改密码👽群雄群聊
返回列表 发布新帖

【开发指南】X3.5插件适配之LSP(Liskov 替代原则)

500 1
发表于 2021-4-13 18:16:51 | 显示全部楼层 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
x3.5新增了插件的审核要求:
自带表类必须兼容 LSP ( Liskov 替代原则 )。如果依赖于主线表,不允许依赖 table 表的兼容性命名。兼容多版本需要自行判定并调用不同名称的方法,或开启不同分支版本维护
很多开发者反应看不懂这句,或者不知道应该如何适配,这里给大家提供一个较为简单的解释和适配方法的指导。

什么是Liskov替代原则:
这里就不用那些术语来解释了,简单的说就是,你所实现的类继承的“基类”能做到的事情,放到你所实现的类里面也必须可以做到。
对插件来说,此处主要指的是你的 source/plugin/你的插件/table/table_xxxxxx.php 这些文件。他们都是在extends discuz_table。

举个例子:
discuz_table里有这样一个方法:
  1. public function insert($data, $return_insert_id = false, $replace = false, $silent = false)
复制代码
那么你所extends的类里如果也定义了一个 insert ,那么首先,上面的代码里所接收的参数,你的实现里也全都得有(顺序一致,数量足够);
并且,传入这些参数,在discuz_table里所能做的事情,你的实现里也必须能做到(即兼容)。

做不到怎么办?
    改名,比如改成insert_extend 修改实现,调整输入参数保持兼容


为什么要适配Liskov替代原则?
这是php 8的新要求,不适配的话会导致无法正常使用。而且随着php的不断发展,这些要求只会变得越来越严格,遵守规范才能让应用长久发展。
顺便说一句,虽说x3.4不支持php 8,但开发3.4应用时也建议留意这些规定,方便未来的迁移。

我一个插件好几十张表,改不动啊!有没有简单一点的办法?
如果你想修改实现的话,这个只能手动来搞了。
优点:可以正确识别不需要修改的部分并予以保留,针对性对需要修改的部分做优化

如果你想改名,那还真有办法:批量替换。
优点:快
缺点:即便是兼容的也会被改掉,可能造成不少不必要的改动。

正则在这里提供给大家了,具体是用php转换,还是把正则复制出来扔vscode里都可以的,相信各位开发者这个一定还是会的吧

适用于source/plugin/你的插件/table/table_xxxxxx.php部分的:
  1. preg_replace('/function\s+(getTable|setTable|count|update|delete|truncate|checkpk|fetch|fetch_all|fetch_all_field|range|optimize|fetch_cache|store_cache|clear_cache|update_cache|update_batch_cache|reset_cache|increase_cache|__toString|_init_extend|attach_before_method|attach_after_method)\s*\(/', 'function $1_extend(', '你的内容')
复制代码

适用于其他地方的:
  1. preg_replace('/(C::t\(\'[^\']+\'\)\s*->\s*)(getTable|setTable|count|update|delete|truncate|checkpk|fetch|fetch_all|fetch_all_field|range|optimize|fetch_cache|store_cache|clear_cache|update_cache|update_batch_cache|reset_cache|increase_cache|__toString|_init_extend|attach_before_method|attach_after_method)\s*\(/', '$1$2_extend(', '你的内容')
复制代码

注意:
    替换字符串里的_extend可以更换成其他你喜欢的后缀 正则无法保证100%完美替换,建议用Git或者beyond compare等工具会替换前后的内容进行对比,并进行适当的修改,切勿盲目相信本替换工具。
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论1

IT618发布Lv.8 发表于 2021-4-13 18:17:22 | 显示全部楼层
提醒:
第二个正则,也就是适用于其他地方的,会同时给调用系统表C::t的地方也加上后缀,这会导致相关代码无法运行。

但开发者并不是不需要关注这些地方,开发者需要到source/class/table里面,找到原来此处写法所对应的方法,看它是否被标记为DISCUZ_DEPRECATED。
如果有,请务必按照方法内实际调用的新方法,对代码进行修改。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图

您的IP:3.18.220.243,113.105.172.59,GMT+8, 2024-5-7 12:39 , Processed in 0.163006 second(s), 78 queries , Gzip On, Redis On.

Based on Discuz! W1.0 Licensed

© 2001-2024 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表