面向对象概念
什么是对象
世间万物皆对象 如是我闻(不抽象–可见实例) 都是对象 如我不闻(抽象-不可见) 也是对象
对象的基本组成
– 对象的组成元素
- 是对象的数据模型 用于描述对象的数据
- 又称为对象的属性 或者对象的成员变量
–对象的行为 - 是队形的行为模型 用于描述对象能做什么事情
- 又称为对象的方法
对象的特点
- 每个对象都是独一无二的
- 对象是个特定的事物,他的职能是完成特定的功能
- 对象是可以重复使用的
什么是面向对象
- 面向就是在编程的时候一直吧对象放在心上
- 面向对象编程就是 在变成的时候数据结构(数据组织方式)都图片你哥哥对象的结构(属性 /方法)进行存储
– 面向对象的实质 - 面向对象就是把生活中要解决的问题都用对象的方式(属性、方法)进行存储 表达表示
– 对象和对象职期间用过 方法的调用完成互动
如下图
为什么使用面向对象
- 对象的描述方式更为贴合真实的世界 有利于大型业务的理解
- 在程序设计的过程中用对象的视角分析世界的时候能够拉近程序设计和真实世界的距离
面向对象的基本思路
- 识别对象:
1 任何实体都可以呗识别为一个对象 - 识别对象的属性:
1 对象里面存储的数据被识别为属性
2 对于不用的业务逻辑,关注的数据不同,对象里面存储的属性也不同 - 识别对象的行为:
1 对象自己属性数据的改变
2 对象和外部交互
如下
面向对象的基本原则
- 对象内部是高内聚的:
1 对象只负责一项特性的职能(职能可大可小)
2 所有对象相关的内容都封装到对象内部 - 对象对外是低耦合的
1 外部世界可以看到对象的一些属性(并非全部)
2 外部世界可以看到对象可以做的某些事情(并非全部)
面向队形的基本实践
类的概念
- 类:
1 物以类聚,把具有相似特性的对象归类到一个类中
2 类定义了这些相似对象拥有的相同的属性和方法
3 类是相似对象的描述,称为类的定义,是该类对象的蓝图或者原型
4 类的对象成为类的一个实例
5 类的属性和方法统称为类成员
例如 - NBA球员是类的一个定义
- 科比 乔丹 詹姆斯 成为类的实例
可根据下图进行理解
实例化的概念
- 就是通过类定义创建一个类的对象
1 比如NBA 球员的定义创建一个球员对象 如下所示
构造函数
创建 NbaPlayer的类
析构函数
- 在程序执行结束的时候会自动调用
- 通过把变量设置为null 可以出发析构函数的调用
- 当对象不会呗使用时 会触发析构函数
- 析构函数通常呗用于清理程序使用的资源 比如程序使用了打印机 那么可以在析构函数中释放打印机资源
面向对象高级实践
继承
- PHP中extends 后面只能跟一个类的类名 这就是PHP的单继承原则
- 继承的好处
1 父类里面定义的类成员可以不用在子类中重复定义,节约了编程的时间和代价
eg: 人的吃的这个方法一点在父类中定义 那么NBA球员和女主播狂歌子类就不需要实现吃这个方法了,好像天生就有这个功能一样
2 同一个父类的子类拥有相同的父类定义的类成员,因此外部代码调用他们的时候可以一视同仁
eg : 一个NBA球员和一个女主播 ,因为他们都是人,可以直接调用父类定义的“吃”的方法,而不用管他们到底是谁
3 子类可以修改和调整父类定义的类的成员
这种我们可以称为重写(Overwrite)
一旦子类修改了,就按照子类修改之后的功能执行 - 可参考下图理解
访问控制
- 面向对象的三种访问权限
1 Public 公有的类成员 可以在任何地方被访问(定义该成员的类,该类的子类,其他类)
2 Protected 受保护的类成员 可以被其本身及其子类访问
3 Private 私有的类成员 只能被自身访问
Static(静态)关键词
- 静态属性用于保存类的共有数据
- 静态方法里面只能访问静态属性
- 静态成员不需要实例化对象就可以访问
- 类的内部可以用self
重写
- 子类中编写跟父类方法名完全一致的方法可以完成对父类方法的重写(overwrite)
Final 关键字
- 对于不想被任何类继承的类可以在class之前添加final 关键字
- 对于不想被子类重写(修改)的方法 可以在方法定义的前面添加final 关键字
数据访问补充
- parent 关键字可以用于调用父类中被子类重写了的方法
- self 关键字 可用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类子身的属性;使用常量的时候不需要在常量名称前添加$ 符号
- static 关键字用于访问类自身定义的静态成员,方位静态属性时需要在属性前面添加$符号
接口
- interface 关键字用于定义接口
- 接口里面的方法不需要有方法的实现
- implements 关键字用于表示类实现某个接口
- 实现了某个接口之后必须提供接口中定义的方法的具体实现
- 可以用extends 让接口实现接口 当类实现子接口的时候,父接口定义的方法也需要在这个类里面具体实现
- 不能实例化接口
- 可以用instanceof 关键字来判断某个对象是否实现了某个接口 eg:
- 对于接口的认识可以参考下图:
- 某个类实现(implements)了某个接口和继承(extends)了某个类的区别
1 实现接口跟继承类很类似,但是接口不能直接创建自己的对象eg :如果创建了会吃东西 这个接口的对象 那么具体怎么吃根本不知道
2 继承的父类必须有该方法的具体实现,子类可以重写父类的方法,也可以不重写
3 接口里的方法是不需具体实现的,只要定义了方法的名称和参数就可以了,具体的实现必须在实现类中定义
4 一句话概括就是 类的方法必须有实现 接口的方法必须为空
多态
- 因为接口的方法实现有很多,所以对于接口里面定义的方法的具体实现是多样性的 这种特性我们称作为多态
eg: 比如接口A有两个实现B和C,B和C对A里面定义的方法的实现可以是不同的,这种现象就是多态
抽象类
- abstract 关键字用于定义抽象类
- 在抽象方法前面加abstract 关键字可不表明这个方法是抽象方法不需要具体的实现
- 抽象类中可以包含普通的方法,有方法的具体实现
- 继承抽象类的关键字是extends
- 继承抽象类的子类需要实现抽象类中定义的抽象方法
面向对象特殊实践
魔术方法
- __construct(), __destruct():之前讲过 这里不再赘述
- __tostring() :当对象被当做String使用时,这个方法会被其自动调用。eg:Echo $obj
- __invoke() : 当对象被当成方法调用时,这个方法会被自动调用。 eg:$obj(4)
这个两个方法在PHP里面 也被称作方法的重载(overloading) 通过这个两个方法,同一个方法的名称的调用可以对应不同的方法实现
- __call(): 当对象访问不存在的方法时,__call()方法会被自动调用
- __callStatic() : 当对象访问不存在的静态方法名称时,__callStatic () 方法会被自动调用
- __get() , __set() ,__isset(), __unset()
- 在给不可访问属性赋值时,__set() 会被调用
- 读取不可访问属性的值时,__get() 会被调用
- 当对不可访问属性调用isset() 或 emnpty()时,__isset()会被调用
- 当对不可访问属性调用unset()时,__unset()会被调用.
- 所谓不可访问,其实就是在调用某个属性时发现这个属性没有被定义。这个时候不同的操作会触发不同的魔术方法
- 这几个方法也可以被称作为属性重载的魔术方法
- __clone() : 参考下图理解
面向对象编程的基本原则
- 单一职责:一个类,只需做好一件事件
- 开放封闭:一个类,应该是可扩展的,而不可修改的
- 依赖倒置:一个类,不应该强依赖另外一个类,每个类对于另外一个类都是不可替换的
- 配置化 : 尽可能的使用配置,而不是硬编码
- 面向接口编程: 只需关心接口,不需要关心实现
摘自慕课网peter Zhou 老师的课程