第一章面向对象思想核心概念代码:classobject{public$name;公共$性别;publicfunctionsay(){echo$this->name."is".$this->gender;}}$student=newobject();$student->name='Tom';$student->gender='male';$student->say();//因为PHP对象是用数组模拟的,所以可以通过将对象转为数组查看该对象的所有属性var_dump($student);var_dump((array)$student);//(array)将对象类型转为数组,打印属性值var_dump(array($student));print_r((array)$student);echo'
';//对象序列化$str=serialize($student);echo$str.'
';file_put_contents('store.txt',$str);//反序列化,取出这个对象$str=file_get_contents('store.txt');$student=unserialize($str);$学生->说();结果:Tomismaleobject(object)[1]public'name'=>string'Tom'(length=3)public'gender'=>string'male'(length=4)array(size=2)'name'=>string'Tom'(length=3)'gender'=>string'male'(length=4)array(size=1)0=>object(object)[1]public'name'=>string'Tom'(乐ngth=3)public'gender'=>string'male'(length=4)Array([name]=>Tom[gender]=>male)O:6:"object":2:{s:4:"name";s:3:"Tom";s:6:"gender";s:4:"male";}Tomimale1.3 继承与多态状态就是重用类,其中之一就是类层面的复用,一个是方法层面的复用。说到继承,就不得不提组合。两者有何异同?PHP有多态性吗?如果不是,为什么不呢?如果是这样,而在其他语言的继承中,用parent指代父类,用self指代自己。使用“::”运算符(作用域解析运算符)调用父类的方法。通过一些总结,得出继承是一种“is,like”的关系,而组合是一种“need”的关系。利用这个规则,可以很容易地判断出父子应该是继承关系,而父亲和家族应该是组合关系。从另一个角度也可以看出,组合强调的是整体与部分的关系,而继承则强调的是父子关系。耦合度是衡量一个软件结构中不同模块之间相互联系程度的指标,即不同模块之间的依赖关系。低耦合是指模块之间尽可能存在独立的模块;模块之间的接口应该尽可能少和简单。现代的面向对象思想不强调对现实世界建模,变得更加理性,注重解耦。解耦就是去除模块之间的依赖关系。按照这种思路,继承和组合在语义上很难区分,当两者都可以使用时,更倾向于使用组合。为什么?继承有什么问题?1)继承破坏封装。比如定义一个鸟作为父类,具有羽毛属性和飞行方法,其子类swan、duck、ostrich等继承bird类。很明显,鸭子和鸵鸟不需要flying这个方法,但是作为子类却可以胡乱使用flying这个方法,这显然破坏了类的封装性。另一方面,组合在语义上优于继承。2)继承紧耦合。继承将子类绑定到父类。组合只是通过一个独特的接口与外界进行通信,耦合度低于继承。3)继承和扩展复杂。随着继承层数的增加,子类的增多,会涉及到大量的方法重写。使用组合,可以根据类型约束实现动态组合,减少代码。4)继承的不当使用可能违反现实世界中的逻辑。1.3.2 各种语言中的多态性多态性的确切含义是:当同一个类的对象接收到相同的消息时,它们会得到不同的结果。而且这个消息是不可预测的。多态,顾名思义,就是多种状态,也就是多种结果。区分是否是多态的关键是看对象是否属于同一类型。如果你把它们看成同一个类型,调用同一个函数,返回不同的结果,那就是多态;否则,它不能称为多态性。由此可见,弱类型PHP中的多态与传统强类型语言中的多态在实现和概念上存在一些差异,弱类型语言中多态的实现更加容易和灵活。本节解决什么是多态性,什么不是多态性的问题。至于多态是如何实现的,各种语言的策略是不一样的。但是,最终的实现无非就是查表判断。总结如下:多态性是指在运行时对同一类型的对象进行物化。PHP语言是弱类型的,多态性更简单,更灵活。类型转换不是多态。在PHP中,父类和子类被视为“继父”和“继子”的关系。他们有继承关系,但没有血缘关系。因此,子类不能向上转化为父类,从而失去了多态最典型的特征。多态的本质是if...else,只是实现层次不同而已。1.4面向接口编程中狭义的接口,即interface关键字。广义的接口可以是任何对外提供服务的接口,比如提供数据传输的USB接口,淘宝开放给其他网站的支付宝接口等。接口作为规范和契约存在。作为规范,接口应该保证可用性;作为契约,接口应该保证可控性。接口只是一个声明,一旦使用了接口关键字,就应该实现它。它可以由程序员(外部接口)或系统(内部接口)实现。接口本身什么都不做,但它告诉我们它能做什么。PHP在接口方面有两个不足,一是没有契约限制,二是内部接口不够。界面其实很简单,但是界面的各种应用非常灵活,很大一部分设计模式都是围绕着界面展开的。1.5 反射在面向对象编程中,对象被赋予了自省的能力,而这种自省的过程就是反射。反思,直观的理解就是根据到达的地方寻找出发地和源头。比如我给你一个裸对象,我只要通过这个对象就可以知道它属于哪个类,它有哪些方法。反射是指对PHP程序在PHP运行状态下的扩展分析,导出或提取类、方法、属性、参数等详细信息,包括注释。这种动态获取信息和动态调用对象方法的能力,就叫做反射API。小结本章主要介绍了面向对象思想程序的构成要素——类和对象。类是动作和属性的模板,对象是数据的集合。结合PHP本身的实际情况,着重讲解PHP中面向对象的一些比较模糊的知识点,包括魔术方法、接口、多态、类重用、反射、异常机制等。接口是一种类型,实现接口说明接口如何实现“即插即用”。
