clone
需要操作原对象,但又不想影响原对象.
基本数据类型和数组都为真复制,即为真副本,当属性为对象时,为假复制,改变副本仍会影响原对象.解决方案:
__clone
在clone前自动触发,可以执行一些在备份前的属性操作.
&
传递引用
方法引用传递,改变源对象
static
延迟静态绑定
应用场景:Dog类和Person类都需要一个返回实例化的方法,Dog类和Person类都继承于Animal抽象类.
拦截器
__get($property)
,访问未定义的属性时调用.
__set($property,$value)
,给未定义的属性赋值时被调用.
__isset($property)
,对未定义属性调用isset()方法时调用.
__unset($property)
,对未定义属性调用unset()方法时调用.
__call($method,$arg_array)
,调用未定义方法时调用.
__call很有用,但要慎用,因为太灵活.
应用场景:有一个专门打印Person类信息的Person_Writer类,如果通过Person类调用Person_Writer类.
回调函数
应用场景: 3个类,Product类
,Product_Sale类
,Product_Totalizer类
,要实现:当卖出Product总共价格超过指定金额时,输出警告.
get_class()
和instanceof
get_class(类)
用于判断是否精准等于类名;
instanceof
可以判断是否其本身或继承于某父类.
类中的方法和类中的属性
get_class_methods('类名')
:获取类中所有方法.
get_class_vars('类名')
:获取类中所有public参数;
反射API
问题:课堂类被演讲类和研讨会类继承着.但是演讲类和研讨类都要实现一次性计费和上N次课计费的方法.和输出计算的方式.
解决方案1: 在课堂类中添加计算一次性付费的方法,上N次课的计费方法和输出计算方式的方法.
解决方案2: 运用组合,将处理计费和输出计算方式单独封装为一个计费策略类.
组合既委托.同级委托.
继承既父子关系.
确保系统中只有唯一一个用例.例如系统配置文件.
重点
1: 构造方法私有.
2: 类本身包含自己的实例化属性.
通过一个父类,生产处多个不同功能的子类.
特点:产品方(新浪微博)和需求方(显示新浪微博)一一对应.
问题:印象笔记中,来源可能为新浪微博,或者开发者头条,在印象笔记显示的时候,两者的页眉和页尾是不一样的.
RLGL!!!.印象笔记不只要显示新浪微博内容!!!还要显示我的新浪账号,还要该微博啊!!卧槽~憋着急,吻我.
工厂模式主要用于生产一一对应的产品方和需求方,而抽象模式要做的是一个需求方(印象笔记_显示新浪微博),要多个工厂(把需求方抽象为多个需求方),例如提供新浪内容的工厂,提供新浪账号的工厂.提供微博内容的评论的工厂等.
代码:
当使用工厂/抽象模式必须要制定具体的创建者(需求方).
平行模式和抽象模式的模型图一致,但代码实现不一样.
抽象模式中父类均为抽象类,而平行模式中,所以类都为普通类,方便父类的实例化.
在这里列出显示印象笔记类的实现代码
其实大家可以发现,原型模式只不过只在最顶层类中包装了一下各组件子类而已,然而这样可以轻松的组合他们,例如实现一个显示新浪微博内容,但要显示开发者头条账号的需求?