代码:程序员
class object { public $name; public $gender; public function say(){ echo $this->name."is".$this->gender; } } $student = new object(); $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 '<br />'; //对象序列化 $str = serialize($student); echo $str.'<br />'; file_put_contents('store.txt',$str); //反序列化,取出这个对象 $str = file_get_contents('store.txt'); $student = unserialize($str); $student->say(); 结果: Tomismale object(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' (length=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";} Tomismale
面向对象的优点在于类的复用
。继承与多态都是对类进行复用,它们一个是类级别的复用
,一个是方法级别的复用
。提到继承必提组合,两者有何异同?PHP到底有没有多态?若没有,则为何没有?有的话,和其余语言中编程
在继承中,用parent
指代父类,用self
指代自身。使用“::”
运算符(范围解析操做符)调用父类的方法。
经过一些总结,得出了继承是一种“是、像
”的关系,而组合是一种“须要
”的关系。利用这条规律,就能够很简单地判断出父亲与儿子应该是继承关系,父亲与家庭应该是组合关系。还能够从另一个角度看,组合偏重总体与局部的关系,而继承偏重父与子的关系。设计模式
耦合是一个软件结构内不一样模块之间互连程度的度量,也就是不一样模块之间的依赖关系。
低耦合指模块与模块之间,尽量地使模块间独立存在;模块与模块之间的接口尽可能少而简单。现代的面向对象的思想不强调为真实世界建模,变得更加理性化一些,把目标放在解耦上。
解耦是要解除模块与模块之间的依赖。
按照这个思想,继承与组合两者语义上难于区分,在两者都可使用的状况下,更倾向于使用组合。为何呢?继承存在什么问题呢?
1)继承破坏封装性。
好比,定义鸟类为父类,具备羽毛属性和飞翔方法,其子类天鹅、鸭子、鸵鸟等继承鸟这个类。显然,鸭子和鸵鸟不须要飞翔这个方法,但做为子类,它们却能够无区别地使用飞翔这个方法,显然破坏了类的封装性。而组合,从语义上来讲,要优于继承。
2)继承是紧耦合的。
继承使得子类和父类捆绑在一块儿。组合仅经过惟一接口和外部进行通讯,耦合度低于继承。
3)继承扩展复杂。
随着继承层数的增长和子类的增长,将涉及大量方法重写。使用组合,能够根据类型约束,实现动态组合,减小代码。
4)不恰当地使用继承可能违反现实世界中的逻辑。数组
多态确切的含义是:同一类的对象收到相同消息时,会获得不一样的结果。而这个消息是不可预测的。多态,顾名思义,就是多种状态,也就是多种结果。
区别是不是多态的关键在于看对象是否属于同一类型。若是把它们看作同一种类型,调用相同的函数,返回了不一样的结果,那么它就是多态;不然,不能称其为多态。因而可知,弱类型的PHP里多态和传统强类型语言里的多态在实现和概念上是有一些区别的,并且弱类型语言实现起多态来会更简单,更灵活。
本节解决了什么是多态,什么不是多态的问题。至于多态是怎么实现的,各类语言的策略是不同的。可是,最终的实现无非就是查表和判断。总结以下:
多态指同一类对象在运行时的具体化。
PHP语言是弱类型的,实现多态更简单、更灵活。
类型转换不是多态。
PHP中父类和子类看作“继父”和“继子”关系,它们存在继承关系,但不存在血缘关系。 所以子类没法向上转型为父类,从而失去多态最典型的特征。
多态的本质就是if…else,只不过实现的层级不一样。函数
狭义的接口,即interface关键字。广义的接口能够是任何一个对外提供服务的出口,好比提供数据传输的USB接口、淘宝网对其余网站开放的支付宝接口。网站
接口做为一种规范和契约存在。做为规范,接口应该保证可用性;做为契约,接口应该保证可控性。
接口只是一个声明,一旦使用interface关键字,就应该实现它。能够由程序员实现(外部接口),也能够由系统实现(内部接口)。接口自己什么都不作,可是它能够告诉咱们它能作什么。
PHP中的接口存在两个不足,一是没有契约限制,二是缺乏足够多的内部接口。
接口其实很简单,可是接口的各类应用很灵活,设计模式中也有很大一部分是围绕接口展开的。this
面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。
反射,直观理解就是根据到达地找到出发地和来源。比方说,我给你一个光秃秃的对象,我能够仅仅经过这个对象就能知道它所属的类、拥有哪些方法。
反射指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。spa
本章主要介绍面向对象思想的程序的组成元素——类和对象。类是一个动做和属性的模板,对象是数据的集合。结合PHP自身实际状况,着重讲述PHP里面向对象的一些比较模糊的知识点,包括魔术方法、接口、多态、类的复用、反射、异常机制等。接口是一种类型,从接口的实现讲述接口是怎么实现“即插即用”的。设计