Yii框架组件和事件行为管理的详细说明
本文描述了Yii框架组件和事件行为管理。分享给大家参考,如下:
Yii是一个基于组件的高性能PHP框架,用于开发大规模Web应用程序。组件是几乎所有类的基类,它控制组件和事件的管理。它的方法和属性如下:私有变量$_e数据存储事件(evnet,有些地方叫hook),以及$_m数组存储行为。
组件管理
YII是一个纯oop框架,许多类中的成员变量是受保护的或私有的。在CComponent中,php中的magic方法_ _ get()和_ _ set()是用来访问和设置属性的,但是这些方法的功能与它们相差甚远。下面用__get()来说明。
公共函数__get($name){ $getter='get '。$ name如果(method_exists($this,$getter))返回$ this-$ getter();else if(strncescmp($ name,' on ',2)==0 method _ exists($ this,$name)) { //在此复制getEventHandlers(),以获得性能$ name=strtolow($ name);if(!isset($ this-_ e[$ name])$ this-_ e[$ name]=new CList;返回$ this-_ e[$ name];} else if(isset($this-_m[$name])返回$ this-_ m[$ name];else if(is _ array($ this-_ m)){ foreach($ this-_ m as $ object){ if($ object-getEnabled()(property _ exists($ object,$ name)| $ object-canGetProperty($ name)))返回$ object-$ name;} }抛出新的CException(Yii:t('yii ',' Property '{class})。未定义“{property}”。数组(' {class}'=get_class($this),' { property } '=$ name));}当$obj-name是组件或其子对象的实例时,__get($name)方法:
1.首先判断实例中是否有getName()方法,如果有,返回;如果不执行步骤2。
2.确定它是否以on开头,这通常在CComponent的子类中保留。在事件中使用并挂起它,并通过method_exists($this,$name)确定该名称是否存在于类的实例中。如果是,返回事件,否则,转到步骤3。
3.如果该名称存在于行为数组中,则返回以更改行为;如果它不存在,请转到步骤4。
4.遍历行为数组。数组中的行为是cbbehavior子类的一个实例,而cbbehavior是CComponent中的一个子类,所以使用递归方法来获取行为中的方法。如果没有,请转到步骤5。
5.引发异常:请求的属性不存在。
__get()方法可以在Component的子类中重载,比如在CModule中加入获取组件的判断。这关注一个问题。最好不要重复属性和组件的名称,因为程序会先加载组件,我们可能得不到想要的属性。如果名称必须重复,我们必须使用getter来获取属性。
public function _ _ get($ name){ if($ this-has component($ name))返回$ this-getComponent($ name);else return parent : _ _ get($ name);}关于组件的加载和创建,上一期YII框架分析第三点有一个问题注1: YII执行流程:注册框架核心组件时,一次加载这么多组件会影响性能吗?实际上,不是,注册时,只有组件及其对应的配置以键值对的形式存储在数组中(预加载的除外)。当使用它们时,组件如上所述被创建,这将由YIIBase中的createComponent()方法创建和初始化。当调用__get()或getComponent()通过CModule或其后代(如CWebApplication)获取组件时,CModule通过$_components数组建立一个对象池,以确保每个组件在请求中只实例化一次。
事件行为管理。
事件相当于组件的扩展或插件,组件中预留的钩子用来实现组件的内部调用和组件的外部部分控制。在CComponent的子类中,以on开头的方法可以定义为事件,类似于js中的onclick和onchange,但是原理是相似的。所有事件都是与组件在同一个文件中的事件的子类。
/***就在应用程序处理请求之前引发。* @param CEvent $event事件参数*/public function onBeginRequest($ event){ $ this-raiseEvent(' onBeginRequest ',$ event);}/***运行应用程序。*此方法加载静态应用程序组件。派生类通常会重写这个*方法来执行更多特定于应用程序的任务。*记得调用父实现,以便加载静态应用程序组件。*/public function run(){ if($ this-hasEventHandler(' onBeginRequest ')$ this-onBeginRequest(new CEvent($ this));$ this-process request();if($ this-hasEventHandler(' onEndRequest ')$ this-onEndRequest(new CEvent($ this));}例如,在处理请求之前,调用CApplication中的run()方法判断onBeginRequest事件的句柄是否从外部传递,如果是,则调用CComponent中的raiseEvent()方法,通过onBeginRequest($event)方法执行句柄中的函数或方法。
是事件的升级版本,所有行为都是CBehavior的子类。分析上面的__get()方法,从Step 4可以看出,行为的作用是完全扩展组件的特性,可以是属性、方法、事件甚至行为,从而使程序开发更加灵活。
该行为的另一个功能是将类似的事件句柄放在一起。当行为执行attach()方法时,会绑定events()方法返回的事件句柄,从而达到方面管理和扩展的目的。例如,CmodelBehavior收集与模型相关的事件,这便于其子类的重用。当我们需要向模型添加行为时,我们可以继承它。
PS:边肖在这里推荐一个本网站的php格式化美化排版工具,帮助你在以后的PHP编程中排版代码:
Php代码在线格式化美化工具:http://tools.jb51.net/code/phpformat.
更多对Yii相关内容感兴趣的读者,请查看本网站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》。
希望本文对基于Yii框架的PHP编程有所帮助。
版权声明:Yii框架组件和事件行为管理的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。