1.1 面向对象的行与本
- 把一个对象存起来,称为序列化,序列化和反序列化都要包含类的名称。
- 序列化只会存储属性,方法通过存储的类名去调用,且公用公共的代码空间;
- php类的实现在底层是通过“属性数组+方法数组”来实现的;
- 对象和数组的却别在于对象多了一个指向类的指针;
- 当对象由标量强制转换成的object,则没有一个类与之对应,php中的“孤儿”类stdClass会收留这个对象;
1.2 魔术方法的应用
- 类似于额外封装的操作,例如construct方法在对象创建之前进行一些操作;get方法会返回类的私有对象;当调用一个不存在的方法时,会调用call;等等。
- 魔术方法使动态创建变成了可能;
1.3 继承与多态
1.3.1 类的组合与继承
- 继承是一种“是”、“像”的关系;组合是一种“需要”、“包含”的关系。
- 低耦合是指模块间的关系尽量少,各模块尽量独立的存在。考虑到这一点,组合是要优于继承的。
- 继承主要问题有:破坏封装性;紧耦合;继承扩展复杂;不恰当的继承可能违背自然界的规律。
- 底层代码多用组合,顶层/业务层代码多用继承。组合效率高,继承灵活。可以专门抽象出特殊的类来供继承。
1.3.4 各种语言中的多态
- 同一类对象收到不同的消息,做出不同的反应,返回不同的结果。多种状态之意。
- php是弱类型的,没有对象类型转换机制。所以不存在子类上升至父类,在调用时动态改变其指向。
- 多态指同一类对象在运行时的具体化;
- php是弱类型语言,实现多态更简单、更灵活;
- 类型转换不是多态;
- 多态的本质就是if。。。else,只不过实现的层级不同。
1.4面向接口编程
1.4.1接口的作用
接口提供一种协议,实现的人需要遵守,调用的人也需要遵守。
1.4.2php接口的思考
- php用到接口的地方不多,可以淡化为设计文档,起到一个团队基本契约的作用。实现一个接口,即可知道这个类可调用的方法,记为接口的真谛!
- 对php中实现接口的类,以接口的身份去调用时,只会关心是否实现对应的方法,不会关心该方法是否定义在接口中,即不关心接口语义是否正确。这就是php中接口中最大的软肋。
1.5反射
1.5.1反射API
对象的自省能力,谓之反射
getProperties();getName();get_class();get_class_vars();get_class_methods();
1.5.2反射有什么用
- 生成文档
- 动态代理(AOP)
1.6 异常和错误处理
1.6.1如何使用异常处理机制
- 在php里,任何自身错误都会触发一个错误,而不是抛出异常;
- 捕获异常必须要程序判断,手动抛出异常。例如if(a=0) throw new emailException();
- 在php里,异常通常用于:对程序的悲观预测;程序的需要和对业务的关注;语言健壮性的要求。
- 异常有两种捕获方式:异常发生时立刻捕获;分散抛异常,集中捕获;
- 对于重要的业务,应该发生异常就立即捕获,并作出相应的补救措施,例如删除文件、回滚数据库等等;对于不是很重要的异常,可以集中处理是的代码更加紧密,逻辑更加专一。
1.6.2 PHP中的异常机制
php中的异常机制准确来说是不健全的,因为无法自动抛出异常,必须手动去判断并抛出,原则上这就是已知的东西,不可以称作异常。
有没有什么机制可以使得php自动抛出异常呢?有的,就是结合php中的错误处理。
1.6.3 php中的错误级别
- 错误级别:deprecated;notice;warning;fatal error;parse error;
- error_reporting=E_ALL|E_STRICT
- display_errors=ON
- @错误抑制符
1.6.4 php中错误处理机制
- set_error_handler(error_function,error_types)
- error_function必须包含四个变量: (errno,errstr,errfile,errline)
- 某些等级的错误自定义处理函数无法接管,必须以原有方式输出。例如E_ERROR、E_PARSE等;
- set_error_handler,restore使得接管失效;
- set_error_handler会使@失效;
- fatal错误虽然无法捕捉,但是还是可以做一些事的。利用register_shutdown _function,在php终止或处罚die时,回光返照下;
- 错误抛出:trigger_error