看到有人在讨论PHP
![](/icons/9290de.gif)
事件驱动问题
![](/icons/9290dou.gif)
本应回复
![](/icons/9290yi.gif)
帖
![](/icons/9290dou2.gif)
但认为回复不足以引起大家
![](/icons/9290de.gif)
重视
![](/icons/9290dou.gif)
故专开
![](/icons/9290yi.gif)
帖详述本人对这个问题
![](/icons/9290de.gif)
理解
![](/icons/9290dou.gif)
并对
![](/icons/9290yi.gif)
佳作进行解释和分析
事件驱动这个概念是广义
![](/icons/9290de.gif)
![](/icons/9290dou2.gif)
可以在客户端
![](/icons/9290dou.gif)
也可以在服务器端
在WEB应用上
![](/icons/9290dou.gif)
在客户端
![](/icons/9290de.gif)
事件是基于JS或是插件或是JAVAAPPLET的类
![](/icons/9290de.gif)
东西
![](/icons/9290dou.gif)
基本上如果是插件或是JAVAAPPLET
![](/icons/9290de.gif)
话
![](/icons/9290dou.gif)
就不属于HTML
![](/icons/9290de.gif)
范畴了
![](/icons/9290dou.gif)
而真正必须用到JS
![](/icons/9290de.gif)
场合其实并不多
![](/icons/9290dou.gif)
最多就是FORM
![](/icons/9290de.gif)
提交或是链接点击的类
![](/icons/9290de.gif)
基本操作
![](/icons/9290dou.gif)
因此谈论事件无太大意义
事件驱动真正
![](/icons/9290de.gif)
意义并不在于可视化编程
![](/icons/9290dou.gif)
而在于它
![](/icons/9290de.gif)
概念
![](/icons/9290dou.gif)
就象OO
![](/icons/9290yi.gif)
样
![](/icons/9290dou2.gif)
事件驱动其实是OO
![](/icons/9290de.gif)
![](/icons/9290yi.gif)
个延伸
![](/icons/9290dou.gif)
它
![](/icons/9290de.gif)
最初原型是消息机制
![](/icons/9290dou2.gif)
但是事件驱动把消息封装成了
![](/icons/9290yi.gif)
个可
![](/icons/9290diaoyong.gif)
![](/icons/9290de.gif)
![](/icons/9290hanshu.gif)
![](/icons/9290dou.gif)
有些类似于API中
![](/icons/9290de.gif)
回调
![](/icons/9290hanshu.gif)
![](/icons/9290dou.gif)
你自己可以定义这些
![](/icons/9290hanshu.gif)
执行
![](/icons/9290de.gif)
内容
![](/icons/9290dou2.gif)
而可视化编程则把这些
![](/icons/9290hanshu.gif)
独立出来
![](/icons/9290dou.gif)
定义好参数(多数是现成
![](/icons/9290de.gif)
对象)
![](/icons/9290dou.gif)
让你自己写代码并运用这些参数(其实是用这些对象)做
![](/icons/9290yi.gif)
些事情
所以
![](/icons/9290dou.gif)
PHP有事件驱动是完全可能
![](/icons/9290de.gif)
![](/icons/9290dou.gif)
主要在于框架
![](/icons/9290de.gif)
设计
![](/icons/9290dou2.gif)
而要做成VB的类所谓
![](/icons/9290de.gif)
可视化事件驱动
![](/icons/9290dou.gif)
则必须要有配套
![](/icons/9290de.gif)
集成开发环境
![](/icons/9290dou.gif)
包括页面设计
![](/icons/9290dou.gif)
事件编码
![](/icons/9290dou.gif)
编译转码的类
![](/icons/9290de.gif)
![](/icons/9290yi.gif)
系列功能才行
![](/icons/9290dou2.gif)
其实象点NET这样
![](/icons/9290de.gif)
事件驱动
![](/icons/9290dou.gif)
只不过是把
![](/icons/9290yi.gif)
些常用
![](/icons/9290de.gif)
WEB元素或Control控件
![](/icons/9290dou.gif)
如按钮、文本框的类
![](/icons/9290de.gif)
东西封装了
![](/icons/9290yi.gif)
下
![](/icons/9290dou.gif)
让你有个可视化
![](/icons/9290de.gif)
界面可以设计
![](/icons/9290yi.gif)
下
![](/icons/9290dou.gif)
当它编译的后
![](/icons/9290dou.gif)
仍然是<inputtype=\"text\">的类
![](/icons/9290de.gif)
文本
![](/icons/9290dou.gif)
只是把你
![](/icons/9290de.gif)
事件代码转为了JS或是服务器端代码而已
![](/icons/9290dou2.gif)
而PHP主要是由于IDE不够丰富
![](/icons/9290dou.gif)
而且也没有预编译机制
![](/icons/9290dou.gif)
所以最后提交
![](/icons/9290de.gif)
代码还是最终
![](/icons/9290de.gif)
PHP代码
![](/icons/9290dou.gif)
而不是点NET
![](/icons/9290de.gif)
资源代码和事件代码
![](/icons/9290de.gif)
混合体(
![](/icons/9290yi.gif)
般是符合XML规范标准
![](/icons/9290de.gif)
ASP文档
![](/icons/9290dou.gif)
包含了非标准
![](/icons/9290de.gif)
HTML代码)
![](/icons/9290dou2.gif)
故此PHP还无法达到大家心目中狭义
![](/icons/9290de.gif)
所谓事件驱动编程
![](/icons/9290dou.gif)
但其实是完全可以没有问题
![](/icons/9290de.gif)
如果大家感兴趣
![](/icons/9290dou.gif)
不妨到www.php.net官方主页去看
![](/icons/9290yi.gif)
下
![](/icons/9290yi.gif)
位中国哥们(QiangXue)写
![](/icons/9290de.gif)
![](/icons/9290yi.gif)
套基于事件驱动
![](/icons/9290de.gif)
PHP框架PRADO
![](/icons/9290dou.gif)
这个还是获得高票当选
![](/icons/9290de.gif)
最佳
![](/icons/9290dou.gif)
强烈推荐!你看了他
![](/icons/9290de.gif)
源代码后就会理解PHP
![](/icons/9290de.gif)
事件驱动是如何回事
![](/icons/9290dou2.gif)
但我认为
![](/icons/9290dou.gif)
在这上面
![](/icons/9290dou.gif)
由于PHP无预编译机制
![](/icons/9290dou.gif)
而且过度依赖OO(虽然是用PHP5写
![](/icons/9290de.gif)
代码)
![](/icons/9290dou.gif)
造成这个框架有些庞大
![](/icons/9290dou.gif)
且使用比较复杂
![](/icons/9290dou.gif)
可扩展性也不是很好
![](/icons/9290dou2.gif)
不过
![](/icons/9290dou.gif)
其中
![](/icons/9290de.gif)
理念非常的好
![](/icons/9290dou.gif)
有些想法还解决了困惑我多日
![](/icons/9290de.gif)
问题
![](/icons/9290dou2.gif)
我下面简单介绍
![](/icons/9290yi.gif)
下这个框架
该框架用ZDE及PHP5写成
![](/icons/9290dou.gif)
有详细文档
![](/icons/9290dou.gif)
结构十分清晰
![](/icons/9290dou.gif)
注释极为充分
![](/icons/9290dou.gif)
代码非常易于读懂
![](/icons/9290dou.gif)
介绍说明作者写码水平非常的高
![](/icons/9290dou2.gif)
作者明确介绍说明
![](/icons/9290dou.gif)
这套框架参考了ASP点NET及BorlandDelphi
![](/icons/9290de.gif)
概念
这个框架在验证性上非常的强(并不是指里面有什么验证登录的类
![](/icons/9290de.gif)
模块)
![](/icons/9290dou.gif)
十分健壮
![](/icons/9290dou.gif)
几乎不可能有什么直接
![](/icons/9290de.gif)
漏洞可以从外面攻入
![](/icons/9290dou.gif)
它是引入了规范标准文件这个概念做限制
![](/icons/9290dou.gif)
很有效地解决了大量验证时
![](/icons/9290de.gif)
效率瓶颈
![](/icons/9290dou.gif)
这种验证思路方法只有
![](/icons/9290yi.gif)
个问题就是规范标准文件本身
![](/icons/9290de.gif)
制作比较费力(当然用工具
![](/icons/9290de.gif)
话是另
![](/icons/9290yi.gif)
回事了)
![](/icons/9290dou.gif)
然而
![](/icons/9290yi.gif)
旦做好(规范标准文件本身有格式和规范标准
![](/icons/9290de.gif)
)
![](/icons/9290dou.gif)
验证就自然而然地由框架去做了
![](/icons/9290dou.gif)
而无需每次人为
![](/icons/9290diaoyong.gif)
![](/icons/9290dou2.gif)
它
![](/icons/9290de.gif)
事件也可以定义在规范标准文件的内(我却认为这就没有必要了)
![](/icons/9290dou.gif)
其实它
![](/icons/9290de.gif)
规范标准文件就有点类似于DELPHI或是VB中
![](/icons/9290de.gif)
FORM定义文件
![](/icons/9290dou.gif)
只不过是用XML写
![](/icons/9290de.gif)
纯文本
![](/icons/9290dou.gif)
而非可视化
![](/icons/9290dou2.gif)
而对于事件驱动
![](/icons/9290dou.gif)
框架内置了
![](/icons/9290yi.gif)
套和点NET类似
![](/icons/9290de.gif)
基本事件流
![](/icons/9290dou.gif)
你可以在区别阶段定制这些事件
![](/icons/9290dou.gif)
其实说白了
![](/icons/9290dou.gif)
就是重新定义这几个OnXXX
![](/icons/9290hanshu.gif)
![](/icons/9290dou.gif)
用给定形式
![](/icons/9290de.gif)
参数
![](/icons/9290dou.gif)
你也可以自己加入自己
![](/icons/9290de.gif)
事件
![](/icons/9290dou.gif)
比如你在定义自己
![](/icons/9290de.gif)
组件时
![](/icons/9290dou.gif)
在规范标准文件中定义好该组件可能有
![](/icons/9290de.gif)
事件
![](/icons/9290hanshu.gif)
及参数
![](/icons/9290dou.gif)
以后你在使用该组件时可以直接定义这些被允许
![](/icons/9290de.gif)
![](/icons/9290hanshu.gif)
——不过我认为这种方式过于复杂
![](/icons/9290dou.gif)
且要大量读入并分析XML文件
![](/icons/9290dou.gif)
虽然十分地严谨
![](/icons/9290dou.gif)
很安全
![](/icons/9290dou.gif)
但有些过分了
![](/icons/9290dou.gif)
也没有充分利用到PHP本身
![](/icons/9290de.gif)
灵活性
![](/icons/9290dou.gif)
我
![](/icons/9290de.gif)
思路是用类似于DELPHI
![](/icons/9290de.gif)
![](/icons/9290hanshu.gif)
句柄赋值
![](/icons/9290de.gif)
办法或是用C
![](/icons/9290de.gif)
回调
![](/icons/9290hanshu.gif)
![](/icons/9290de.gif)
特性
![](/icons/9290dou.gif)
即可在写代码时在任何时间任何地点定义事件
![](/icons/9290dou.gif)
而仍然能明确事件发出者及类型并有足够地安全性保证
![](/icons/9290dou.gif)
且无需机械地强制各个组件只能有哪些事件
![](/icons/9290dou.gif)
代码修改及扩展都十分方便
![](/icons/9290dou2.gif)
当然
![](/icons/9290dou.gif)
在做大项目
![](/icons/9290de.gif)
时候
![](/icons/9290dou.gif)
严格
![](/icons/9290de.gif)
定义是必要
![](/icons/9290de.gif)
![](/icons/9290dou.gif)
不过
![](/icons/9290dou.gif)
即使如此
![](/icons/9290dou.gif)
该框架处理事件
![](/icons/9290de.gif)
思路方法还是有些古板
![](/icons/9290dou2.gif)
[Page]
它
![](/icons/9290de.gif)
模板我认为是
![](/icons/9290yi.gif)
个比较好
![](/icons/9290de.gif)
想法
![](/icons/9290dou.gif)
它
![](/icons/9290de.gif)
模板有些类似于点NET
![](/icons/9290de.gif)
ASP文件在编译前
![](/icons/9290de.gif)
文件(我对ASP点NET并不熟
![](/icons/9290dou.gif)
但明白
![](/icons/9290yi.gif)
些原理)
![](/icons/9290dou.gif)
但起作用
![](/icons/9290de.gif)
方式则类似于DELPHI
![](/icons/9290de.gif)
FORM文件
![](/icons/9290dou.gif)
是
![](/icons/9290yi.gif)
个很好
![](/icons/9290de.gif)
概念
![](/icons/9290dou.gif)
唯
![](/icons/9290de.gif)
![](/icons/9290yi.gif)
缺点是用DW的类所见即所得
![](/icons/9290de.gif)
通用编辑器则感觉不是很顺手
![](/icons/9290dou.gif)
![](/icons/9290yinwei.gif)
![](/icons/9290yi.gif)
个模板中可以同时把几个互斥
![](/icons/9290de.gif)
组件放在
![](/icons/9290yi.gif)
起
![](/icons/9290dou.gif)
而只在运行过程中决定显示哪些
就我本人看该框架
![](/icons/9290de.gif)
代码
![](/icons/9290dou.gif)
还是发现它有
![](/icons/9290yi.gif)
些非常弱
![](/icons/9290de.gif)
项
![](/icons/9290dou2.gif)
其中最主要
![](/icons/9290de.gif)
![](/icons/9290yi.gif)
个就是路径
![](/icons/9290de.gif)
问题
![](/icons/9290dou.gif)
可扩展性很低
![](/icons/9290dou.gif)
应该比较适用于专用主机
![](/icons/9290dou.gif)
对
![](/icons/9290yi.gif)
些受限主机(目录限制或是权限限制)就无能为力了
![](/icons/9290dou.gif)
也无相应
![](/icons/9290de.gif)
提醒措施(也无相关接口)
![](/icons/9290dou2.gif)
它对某些资源或文件
![](/icons/9290de.gif)
路径
![](/icons/9290dou.gif)
用了
![](/icons/9290yi.gif)
种繁琐
![](/icons/9290de.gif)
叫as
![](/icons/9290set.gif)
Service
![](/icons/9290de.gif)
机制
![](/icons/9290dou.gif)
目
![](/icons/9290de.gif)
就是确定文件
![](/icons/9290de.gif)
路径
![](/icons/9290dou.gif)
作者自己也说
![](/icons/9290dou.gif)
如果用了这个服务
![](/icons/9290dou.gif)
系统消耗会明显增加
![](/icons/9290dou.gif)
其实这个是借鉴了FLASH中as
![](/icons/9290set.gif)
library
![](/icons/9290de.gif)
概念
![](/icons/9290dou.gif)
它这样虽然可以任意指定路径
![](/icons/9290dou.gif)
但每次都必须重新校验
![](/icons/9290dou.gif)
有些得不偿失
![](/icons/9290dou2.gif)
我
![](/icons/9290de.gif)
作法则是固定好几个主要路径
![](/icons/9290dou.gif)
而其
![](/icons/9290de.gif)
子目录都可随意
![](/icons/9290dou.gif)
就综合平衡了两者
![](/icons/9290de.gif)
矛盾
![](/icons/9290dou2.gif)
由于对路径问题缺乏考虑
![](/icons/9290dou.gif)
导致该框架对语言设置、个性化模板等无能为力
![](/icons/9290dou.gif)
如要翻译
![](/icons/9290yi.gif)
个项目
![](/icons/9290dou.gif)
手续的繁
![](/icons/9290dou.gif)
工作量的大是可想而知
![](/icons/9290de.gif)
![](/icons/9290dou.gif)
而且极易出错
![](/icons/9290dou2.gif)
这是该框架中最严重
![](/icons/9290de.gif)
![](/icons/9290yi.gif)
个问题
从总体上来说
![](/icons/9290dou.gif)
该框架
![](/icons/9290de.gif)
理念上
![](/icons/9290dou.gif)
设计上
![](/icons/9290dou.gif)
代码上绝对都属
![](/icons/9290yi.gif)
流
![](/icons/9290dou2.gif)
当然不足总是有
![](/icons/9290de.gif)
![](/icons/9290dou.gif)
不过完全不妨碍我们研究及学习它
![](/icons/9290dou2.gif)
它
![](/icons/9290de.gif)
代码我并未全看
![](/icons/9290dou.gif)
只主要看了几个核心
![](/icons/9290chengxu.gif)
及
![](/icons/9290yi.gif)
些介绍说明
![](/icons/9290dou.gif)
但已能足够看清楚其结构和思想
![](/icons/9290dou.gif)
对作者深表佩服
![](/icons/9290dou.gif)
但对其中
![](/icons/9290de.gif)
不足也深表遗憾
![](/icons/9290dou2.gif)
不管如何样
![](/icons/9290dou.gif)
它都绝对是研究PHP事件驱动代码
![](/icons/9290de.gif)
好作品
![](/icons/9290dou2.gif)
因此强烈推荐!
延伸阅读
最新评论