<![CDATA[谈谈PHP为什么不支持重载和多态]]>

探讨了在使用Zend Framework进行架构改造时遇到的PHP成员覆盖及重载难题。作者指出PHP缺乏重载支持,并讨论了由此导致的代码冗余问题及一个与构造函数执行不确定性相关的bug。
突然又想到了,这个问题,不要说我为什么老是用别人的标准来衡量它,道理很简单,因为我要用,最近在对zend framework做一次构架改造,遇到了需要覆盖成员和重载的难题,但是很可惜php是不支持的,只能写很多不同名方法,这看起来也不错,但是仔细想想这样代码的冗余度是极高的,也不利于接口应用。

说道这个问题,就要说说我很早以前发现的php bug,最后的结论php具有执行的不确定性,当它找不到默认构造的时候的时候(也就是写入一个参量不存在的php构造方法),这个时候php依然执行了它的默认无参数构造,而这在程序中会引起很大的问题。这个问题我当时从php的bug report得到的回答这是对的,我是错的,我不知道我对对象的理解是否有问题,我只知道它执行了一个我不期望的方法,但这被认为是对的,原因就是当在没有重载概念时当然是对的,为什么不对?因为只要参数不违法就能执行,php似乎对参量控制都很松(这种松是我无法忍受的),php最大的问题就是false是没有值,不是null就是空,这是一个很奇妙的问题,等于在php中机会不会出错的,这也就能解释为什么它不能重载,因为当他发现方法没有时他根本无法判断这到底是不存在还是类没有初始化,因为他们得到的结果都是一样的!而我不知道为什么这么一个愚蠢的问题为什么得不到修正,至少我知道的语言里没有这样false不知道是啥的语言,php就是这样的。牢骚就不说了,写点难看的具有php特色的代码去。
没有像这种安装文件吗,xml 文件,否则如何识别启用呢 cat discuz_plugin_monitor_tool.xml <?xml version="1.0" encoding="ISO-8859-1"?> <root> <item id="Title"><![CDATA[Discuz! Plugin]]></item> <item id="Version"><![CDATA[X3.5]]></item> <item id="Time"><![CDATA[2025-07-15 22:00]]></item> <item id="From"><![CDATA[运维监控规则对比系统 (http://yoursite.com/)]]></item> <item id="Data"> <item id="plugin"> <item id="available"><![CDATA[1]]></item> <item id="adminid"><![CDATA[1]]></item> <item id="name"><![CDATA[运维监控规则对比系统]]></item> <item id="identifier"><![CDATA[monitor_tool]]></item> <item id="description"><![CDATA[上传监控规则文件,与参考知识库进行比对,发现缺失的监控项]]></item> <item id="datatables"><![CDATA[]]></item> <item id="directory"><![CDATA[monitor_tool/]]></item> <item id="copyright"><![CDATA[ForOps]]></item> <item id="version"><![CDATA[1.0.0]]></item> <item id="__modules"> <item id="0"> <item id="name"><![CDATA[monitor_tool]]></item> <item id="menu"><![CDATA[监控规则比对]]></item> <item id="url"><![CDATA[]]></item> <item id="type"><![CDATA[1]]></item> <item id="adminid"><![CDATA[0]]></item> <item id="displayorder"><![CDATA[0]]></item> <item id="navtitle"><![CDATA[]]></item> <item id="navicon"><![CDATA[]]></item> <item id="navsubname"><![CDATA[]]></item> <item id="navsuburl"><![CDATA[]]></item> </item> </item> </item> <item id="version"><![CDATA[X3.5]]></item> </item> </root> [root@iZbp14ccarfizbeqtoicioZ monitor_tool]#
07-19
你提到的 XML 文件结构是 **Discuz! X3.5 插件安装包的标准格式**,它决定了插件的基本信息、模块结构、菜单项、数据库表等,是插件被 Discuz! 后台识别安装的关键文件。 你给出的 `discuz_plugin_monitor_tool.xml` 是一个 **完整插件安装包的定义文件**,它包含了插件的名称、标识、版本、菜单项、权限控制等信息。 --- ## ✅ 如何识别启用插件? 在 Discuz! 中,插件的识别启用流程如下: ### 1. 插件上传或手动安装 你可以通过后台插件管理页面上传 `.zip` 格式的插件包(包含 `.xml` 插件定义文件所有插件资源文件),或者手动将插件文件放入 `source/plugin/` 目录下。 ### 2. 插件信息读取 Discuz! 会读取插件包中的 `.xml` 文件(如你提供的 `discuz_plugin_monitor_tool.xml`),解析其中的 `<item id="plugin">` 部分,获取插件基本信息: - `name`: 插件名称 - `identifier`: 插件唯一标识符(必须唯一) - `description`: 插件描述 - `version`: 插件版本 - `directory`: 插件目录路径(相对于 `source/plugin/`) ### 3. 插件安装 Discuz! 会根据 XML 中的信息将插件信息写入数据库表 `pre_common_plugin`,并在后台插件列表中显示出来。 --- ## ✅ 插件启用流程说明 1. **插件启用后**: - Discuz! 会加载插件目录下的 `plugin_{identifier}.php` 文件。 - 如果插件使用了钩子(hook),Discuz! 会将钩子注册到系统中。 - 如果插件定义了后台菜单项,也会在后台“插件”菜单中显示。 2. **钩子机制**: - 插件通过钩子接管 Discuz! 的执行流程,例如: - `global_header`:在页面头部插入内容 - `index_top`:在首页顶部插入内容 - `user_logging`:接管用户登录逻辑 --- ## ✅ 你提供的 XML 文件解析 ```xml <item id="plugin"> <item id="available"><![CDATA[1]]></item> <!-- 是否启用 --> <item id="adminid"><![CDATA[1]]></item> <!-- 管理员权限级别 --> <item id="name"><![CDATA[运维监控规则对比系统]]></item> <item id="identifier"><![CDATA[monitor_tool]]></item> <item id="description"><![CDATA[上传监控规则文件,与参考知识库进行比对,发现缺失的监控项]]></item> <item id="directory"><![CDATA[monitor_tool/]]></item> <item id="copyright"><![CDATA[ForOps]]></item> <item id="version"><![CDATA[1.0.0]]></item> <item id="__modules"> <item id="0"> <item id="name"><![CDATA[monitor_tool]]></item> <item id="menu"><![CDATA[监控规则比对]]></item> <item id="type"><![CDATA[1]]></item> <!-- 模块类型:1=后台菜单 --> <item id="adminid"><![CDATA[0]]></item> <!-- 菜单访问权限 --> </item> </item> </item> ``` 这段 XML 表示: - 插件名称:运维监控规则对比系统 - 插件标识:`monitor_tool` - 插件目录:`source/plugin/monitor_tool/` - 包含一个后台菜单项:`监控规则比对` - 插件版本:1.0.0 --- ## ✅ 你原来的插件结构应该如下: ``` source/plugin/monitor_tool/ ├── plugin_monitor_tool.php <-- 插件主文件 ├── admincp.php <-- 后台管理入口 ├── template/ │ └── admin/ │ └── monitor_tool.htm <-- 后台模板 └── discuz_plugin_monitor_tool.xml <-- 插件安装定义文件 ``` --- ## ✅ 插件主文件示例:`plugin_monitor_tool.php` ```php <?php if (!defined('IN_DISCUZ')) { exit('Access Denied'); } class plugin_monitor_tool { function __construct() { // 构造函数 } // 示例钩子函数 function global_footer() { echo '<div style="text-align:center; color:#888;">监控插件已加载</div>'; } } ``` --- ## ✅ 后台入口文件:`admincp.php` ```php <?php if (!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) { exit('Access Denied'); } cpmsg('monitor_tool_welcome', '', 'succeed', '欢迎使用运维监控规则对比系统'); ``` --- ## ✅ 如何打包插件为 .zip 格式 你可以将插件目录打包为 `.zip` 文件,结构如下: ``` discuz_plugin_monitor_tool.zip ├── discuz_plugin_monitor_tool.xml ├── plugin_monitor_tool.php ├── admincp.php └── template/ └── admin/ └── monitor_tool.htm ``` --- ## ✅ 总结 你提供的 `.xml` 文件是完整的插件定义文件,只要目录结构正确、文件名匹配、路径无误,就可以被 Discuz! 正确识别安装。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值