一、面向对象思想的核心概念
1.面向对象思想的核心思想是对象、封装、可重用性和可扩展性。面向对象是建立在面向过程之上的更高层次的抽象。
2.面向对象和具体的语言无关。
A.百度对象的“形”与“本”
1.类是我们对一组对象的描述
①类定义了一系列的属性和方法,并提供了实际的操作细节,这些方法可以用来对属性进行加工
②对象含有类属性的具体值,这就是类的实例化
②类与对象的关系似一种服务与被服务、加工与被加工的关系
2.所谓序列化,就是把保存在内存中的各种对象状态(属性)保存起来,并且在需要时可以还原出来
3.对象和数组的区别在于:对象还有个指针,指向了它所属的类
4.对象和类:
①类是定义一系列属性和操作的模板,而对象则把属性进行具体化,然后交给类处理
②对象就是数据,对象本身不包含方法,但是对象有一个“指针”指向一个类,这个类里面可以有方法
③方法描述不同属性所导致的不同
④类和对象不是可分割的,有对象就必定有一个类和其对应,否则这个对象也就成了没有亲人的孩子
B.魔术方法应用
1.魔术方法是以两个下划线开头、具有特殊作用的一些方法,可以看做PHP的“语法糖”。
2.php的重载与Java的不同,构造函数不属于重载,而__set、__get属于重载。php的重载指动态地“创建”类属性和方法。
3.当调用一个不可访问的方法(如未定义或不可见)时,__call()会被调用,实际上,魔术方法使方法的动态创建变为可能,这在MVC等框架设计中是很有用的语法。
C.继承与多态
1.用“::”访问一个非静态方法不符合语法,但PHP仍然能够正确地执行代码,这只是PHP的一个“兼容“或者说是”让步”,修改error_reporting打开e_strict报错就会出错
2.耦合是一个软件结构内不同模块之间互连程序的度量,也就是不同模块之间的依赖关系
低耦合是指模块与模块之间,尽可能地例模块间独立存在;模块与模块之间的接口尽量少而简单
更倾向于使用组合,因为:
①继承破坏封装性
②继承是紧耦合的
③继承扩展复杂
④不恰当地使用继承可能违反现实世界中的逻辑
3.组合需要一一创建局部对象,增加代码量
4.如何使用继承:
①精心设计专门用于被继承的父类,继承树稳定,不超过3层
②对于不是专门用于被继承的类,禁止其被继承
③优先考虑用组合关系提高代码的可重用性
④子类是一种特殊的类型,而不只是父类的一个角色
⑤子类扩展,而不是覆盖或者使父类的功能失效
⑥底层代码多用组合,顶层/业务层代码多用继承
5.多态:同一类的对象收到相同消息时,会得到不同的结果,而这个消息是不可预测的,顾名思义,就是多种状态,多种结果。
6.多态的真正意义是:在实际开发中,只要关心一个接口或基类的编程,而不必关心一个对象所属于的具体类。
7.PHP是弱类型的,并且也没有对象转换机制,所以不能像C++或Java那样实现派生类对象赋值给基类对象(calssa=newclassb),所以PHP的父类重载不是多态。PHP的接口实现属于多态。
8.区别是否多态的关键在于看对象是否是同一类型。多态的本质就是if...else,只不过实现的层级不同。
D.面向接口编程
1.接口定义一套规范,描述一个“物”的功能,要求如果现实中的“物”想成为可用,就必须实现这些基本功能。接口这样描述自己:“对于实现我的所有类,看起来都应该像我现在这个样子”。“接口为抽象而生”。因此,在程序里,接口的方法必须被全部实现,否则将报fetal错误。
2.接口不仅规范接口的实现者,还规范接口的执行者,不允许调用接口中本不存在的方法。当然这并不是说一个类如果实现了接口,就只能实现接口中才有的方法,而是说,如果针对的是接口,而不是具体的类,则只能按接口的约定办事。
3.PHP的接口在“面向契约编程”中是不足的,可以淡化为设计文档,起到一个团队基本契约的作用。由于PHP是弱类型,且强调灵活,所以并不推荐大规模使用接口,而是仅在部分“内核”代码中使用接口。
4.接口本身什么也不做,系统悄悄地在内部实现了接口的行为。Traits可以被视为一种加强型的接口。
E.反射
1.直观理解就是根据到达地找到出发地和来源。在PHP运行状态中,扩展分析PHP程序,导出或提取出半天类、方法、属性等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射。
2.反射不仅可以用于类和对象,还可以用于函数、扩展模块、异常等
3.用一反射的地方:一个是对对象进行调试,另一个是获取类的信息。反射的消耗很大,在可以找到替代方案的情况下,就不要滥用。
4.很多时候,善用反射能保持代码的优雅和简洁,但反射也会破坏类的封装性,因为反射可以使本不应该暴露的方法或属性被强制暴露了出来,这既是优点也是缺点。
F.异常和错误处理
1.PHP里的异常,是程序运动中不符合预期的情况及与正常流程不同的状况。一种不正常的情况,就是按照正常逻辑不该出错,但仍然出错的情况,这属于逻辑和业务流程的一种中断,而不是语言错误。PHP里的错误则属于自身问题,是一种非法语法或者环境问题导致的、让编译器无法通过检查甚至无法运行的情况。
2.在PHP里,任何自身错误都会触发一个错误,而不是抛出异常(对于一些情况,倒同时抛出错误和异常)。PHP一旦遇到非正常代码,通常都会触发错误,而不是抛出异常。在这个意义上,如果想使用异常处理不可预料的问题,是办不到的。比如,想在文件不存在且数据库链接打不开时触发异常是不可行的,这在PHP中作为错误抛出,而不会作为异常自动捕获。
3.PHP通常是无法捕获有意义的异常的,它把所有不正常的情况都视为了错误,你要想捕获这个异常,就得使用if...else结构。
4.什么时候使用异常处理机制:
①对程序的悲观预测
②程序的需要和对业务的