1.面向对象编程有什么好处
维护简单
模块化是面向对象编程中的一个特征。实体被表示为类和同一名字空间中具有相同功能的类,我们可以在名字空间中添加一个类而不会影响该名字空间的其他成员。
可扩充性
面向对象编程从本质上支持扩充性。如果有一个具有某种功能的类,就可以很快地扩充这个类,创建一个具有扩充的功能的类。
代码重用
由于功能是被封装在类中的,并且类是作为一个独立实体而存在的,提供一个类库就非常简单。
2.面向对象编程的特性
封装
封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据,一方面避免随意调用更加安全,一方面调用者不必知道内部细节更易读,维护简单。
继承
继承最大的一个好处就是代码重用。
多态
如果要增加一种接口的实现类,那就直接新增一个类,编写自己的对应方法,完全不用改动其他地方的代码。多态提高了代码的可扩展性。
3.设计原则
开闭原则
单一职责原则
接口隔离原则
依赖反转原则
最少知道原则(迪米特法则)
一个类对自己依赖的类知道的越少越好
里氏替换原则
4.了解的设计模式有哪些,laravel(TP)中用到了哪些设计模式,自己实现过哪些设计模式
laravel中的
外观模式:门面代理了很多复杂的类,可以让调用更加简洁,不必使用很长的类名去调用它们。
注册树模式:服务容器中对对象的管理就是采用注册树模式,方便调用和统一管理。
依赖注入、服务容器:把需要实例化的对象当作参数传递进来,实现了最大限度的解耦。
单例模式:服务容器中对http核心、debug核心、console核心都是采用单例模式,可以减少对资源的重复消耗。
装饰器模式:中间件在不改变核心代码的基础上对其进行限流、验权、返回数据格式处理等
监听器模式:在事件源中抛出事件,监听器去监听此事件,触发对应处理器。
mvc模式:
生产者消费者模式:消息队列就是采用此模式,生产者将消息放入队列,消费者去消费,可以实现异步、解耦、削峰。
观察者模式:发布订阅模式,一方监测着另一方的指定动作,一旦改变会收到通知。
数据映射模式:数据库的模型类将表当作一个类,列当作属性,可以直接对数据进行操作。
流接口模式:串式的方法名,非常易于阅读理解,对数据库的操作方法是非常典型的应用。
(
php如何保证单例模式?
禁止通过new、clone、序列化等方式生成实例(分别通过把__construct()、__clone()、__wakeup()设为私有方法),把生成实例的赋值给static变量并且再次生成前去判断此变量是否已被赋值(设为static它生成的方法就可以全局使用)。
)
其他了解的
代理模式:像mycat之类代理了数据库连接,程序不再关心哪个操作发给哪个数据库,由它统一代理分发,这使得程序和数据库解耦。
适配器模式:当两个接口间不能直接相容,可以写一个适配器来连接两个接口。
对象池模式:线程池、连接池等都是采用的对象池模式,需要一个连接对象时直接去连接池里获取,而不是现场创建一个,使用完后归还给线程池,而不是销毁它。它省去了大量创建和销毁的过程,很适合有一定并发量的场景,如果并发太少并不合算(维护这些对象也需要一定资源开销)
多例模式:与单例模式类似,可以允许指定数量的对象。用于数据库集群连接之类的。
原型模式:不是用new去创建对象,而是用__clone()去克隆一个,它可以复刻对象在某一刻的状态。
自己实现的:
注册树模式、数据映射模式:项目中很多地方需要用到log、redis等,自己实现了一个类用来统一管理redis的key值(这模仿了服务容器对对象进行管理)
依赖注入:对项目中数据表模型的简单操作封装了一个BaseModel类,把需要操作的表名字注入进行操作。
5.self、$this、parent、static区别?
self:当前类,主要用来调用静态方法和变量。
$this:当前实例,无法指向静态变量和静态方法。
parent:当前类的父类。
static:延迟静态绑定,在父类中引用到扩展类的最终状态,也就是指向调用它的类。
6.接口和抽象类的区别
接口 | 抽象类 | |
成员变量 | 不能 | 能 |
构造函数 | 不能 | 能 |
抽象方法 | 必须全部是,无需也不能abstract描述 | 可以不是,抽象方法要用abstract描述 |
继承和实现 | 一个类可以实现(implements)多个接口 | 一个类只能继承(abstract)一个抽象类 |
(抽象类和普通类非常相似,只有定义的时候需要声明为abstract class,可以包含抽象方法,抽象方法:只有定义没有方法体,例: function Test(); )
7.写一个单例模式的例子
(见其他文章)