【开发指南】X3.5插件适配之LSP(Liskov 替代原则)
x3.5新增了插件的审核要求:很多开发者反应看不懂这句,或者不知道应该如何适配,这里给大家提供一个较为简单的解释和适配方法的指导。
什么是Liskov替代原则:
这里就不用那些术语来解释了,简单的说就是,你所实现的类继承的“基类”能做到的事情,放到你所实现的类里面也必须可以做到。
对插件来说,此处主要指的是你的 source/plugin/你的插件/table/table_xxxxxx.php 这些文件。他们都是在extends discuz_table。
举个例子:
discuz_table里有这样一个方法:那么你所extends的类里如果也定义了一个 insert ,那么首先,上面的代码里所接收的参数,你的实现里也全都得有(顺序一致,数量足够);
并且,传入这些参数,在discuz_table里所能做的事情,你的实现里也必须能做到(即兼容)。
做不到怎么办?
为什么要适配Liskov替代原则?
这是php 8的新要求,不适配的话会导致无法正常使用。而且随着php的不断发展,这些要求只会变得越来越严格,遵守规范才能让应用长久发展。
顺便说一句,虽说x3.4不支持php 8,但开发3.4应用时也建议留意这些规定,方便未来的迁移。
我一个插件好几十张表,改不动啊!有没有简单一点的办法?
如果你想修改实现的话,这个只能手动来搞了。
优点:可以正确识别不需要修改的部分并予以保留,针对性对需要修改的部分做优化
如果你想改名,那还真有办法:批量替换。
优点:快
缺点:即便是兼容的也会被改掉,可能造成不少不必要的改动。
正则在这里提供给大家了,具体是用php转换,还是把正则复制出来扔vscode里都可以的,相信各位开发者这个一定还是会的吧
适用于source/plugin/你的插件/table/table_xxxxxx.php部分的:
适用于其他地方的:
注意:
自带表类必须兼容 LSP ( Liskov 替代原则 )。如果依赖于主线表,不允许依赖 table 表的兼容性命名。兼容多版本需要自行判定并调用不同名称的方法,或开启不同分支版本维护
什么是Liskov替代原则:
这里就不用那些术语来解释了,简单的说就是,你所实现的类继承的“基类”能做到的事情,放到你所实现的类里面也必须可以做到。
对插件来说,此处主要指的是你的 source/plugin/你的插件/table/table_xxxxxx.php 这些文件。他们都是在extends discuz_table。
举个例子:
discuz_table里有这样一个方法:
- public function insert($data, $return_insert_id = false, $replace = false, $silent = false)
并且,传入这些参数,在discuz_table里所能做的事情,你的实现里也必须能做到(即兼容)。
做不到怎么办?
- 改名,比如改成insert_extend 修改实现,调整输入参数保持兼容
为什么要适配Liskov替代原则?
这是php 8的新要求,不适配的话会导致无法正常使用。而且随着php的不断发展,这些要求只会变得越来越严格,遵守规范才能让应用长久发展。
顺便说一句,虽说x3.4不支持php 8,但开发3.4应用时也建议留意这些规定,方便未来的迁移。
我一个插件好几十张表,改不动啊!有没有简单一点的办法?
如果你想修改实现的话,这个只能手动来搞了。
优点:可以正确识别不需要修改的部分并予以保留,针对性对需要修改的部分做优化
如果你想改名,那还真有办法:批量替换。
优点:快
缺点:即便是兼容的也会被改掉,可能造成不少不必要的改动。
正则在这里提供给大家了,具体是用php转换,还是把正则复制出来扔vscode里都可以的,相信各位开发者这个一定还是会的吧
适用于source/plugin/你的插件/table/table_xxxxxx.php部分的:
- 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(', '你的内容')
适用于其他地方的:
- 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等工具会替换前后的内容进行对比,并进行适当的修改,切勿盲目相信本替换工具。