第一个是“属性(Property)成员”,加引号是因为这个名词是我自己拼凑的,大家尝试理解一下好了,类(class)里面有的东西,统称为成员(member),这里面又有细分,有域(field),有属性(property),有方法(method)。在这三个东西里面,其实属性是一种比较特殊的域,所以,在很多编程语言里面,并没有专门去实现属性这个东西,比如PHP里面就没有,PHP里面只有域的概念,也就是我们说的成员变量,可以是公有的、保护的或者私有的。属性比起域来说,有更高的要求,比如属性有访问控制,有的属性是只读的、只写的、读写的,这是普通公有成员变量做不到的;属性还可以进行类型检查;属性还可以附加一些逻辑;在这些好处的基础上,属性还可以像普通成员变量那样去访问。这些主要是通过PHP5里面的魔术方法来实现的,可以看看CComponent里面的几个魔术方法来了解详情。
第二个是事件驱动,组件模型里面实现了事件驱动的全套机制。包括事件触发,事件处理器的绑定,解绑定。组件内部,使用一个私有数组来保存事件和其对应的处理器(handler),数组的键值是事件的名称,数组的值是一个Yii实现的数据结构CList,这个链表里每个元素都都是一个回调函数。在Yii框架中,要使用事件是比较简单,首先创建一个以on+事件名称的函数,作为这个事件的句柄,同时也是这个事件的触发器,在这个函数里调用CComponent的RaiseEvent函数,来使这个事件发生。虽然有attachEvnentHandler函数用于绑定事件处理器,但是CComponent提供了一种更加优雅便捷的方式来绑定处理器,可以直接给on+事件名的属性赋值一个回调函数即可。这个也是因为在魔术方法__set中做了相应的处理。
第三个是行为,行为对我来说,一直都是一种难以理解的东西,简单来说,就是一种在运行时扩展一个类的方法的方案,听起来非常激动人心,但是更多的时候,并没有什么用处,因为我们扩展一个类,经常的做法是继承,甚至事件模型本身就可以极大地丰富一个对象能做到地事情,也同样是一种松耦合。官方文档库里有一篇东西,试图去解释这个问题,里面提到的是这个行为模式,可以代替C++里面的多继承,又说可以像Ruby里面那样,在运行时扩展一个对象的方法。事实上,像js这样的原型继承语言,可以在运行时,给一个对象增加方法,增加完了马上就可以调用,你可以认为,在Yii框架下,所有组件都有这个能力,事实上,我还没有碰到一个让人信服的实例,非用Behavior才能解决问题的。

VP UML功能是非常强大,用起来也方便。就是卡了点~~
缺点不止一个卡,社区版本,超过一张diagram,输出后会带上很密集的水印,很恶心。
是的,水印相当的多。。。根本没法拿出去给人看。。。