什么是对象?
一切可见的事物都可以是对象;
一切抽象的概念也可以是对象;
对象的组成元素
对象包含两部分
1、对象的组成元素
- 指对象的数据模型,描述对象的数据,比如球员的身体数据、所属球队数据等;
- 即对象的属性,或对象的成员变量;
2、对象的行为
- 指对象的行为模型,描述对象可以实现的功能,比如球员移动、跳跃、投篮等;
- 即对象的方法;
对象的特点
- 每一个对象都是独一无二的
- 对象是一个特定事物,他的职能是完成特定功能(如不同的职业做不同的事)
- 对象是可以重复使用的
什么是面向对象?
- 就是编程过程中数据结构(数据组织方式)都通过对象的结构进行存储;
- 本质:将要解决的问题通过属性、方法的形式进行存储、处理。
面向对象的好处
- 描述方式更贴合真实世界,有利于大型业务的理解
- 拉近与真实世界的距离
面向对象的基本思路
第一步:识别对象
- 任何实体都可以被识别为一个对象
第二步: 识别对象的属性
- 对象里存储的数据
- 不同的业务逻辑,关注的数据不同,存储的属性也不同(数据表内容)
第三步:识别对象的行为
- 对象自己属性数据的改变
- 对象与外部发生的交互
面向对象的基本原则
对象内部是高内聚的(分工明确)
- 对象只负责一项特定的职能(可大可小)
- 所有对象相关的内容都封装到对象内部
对象对外是低耦合的(相互之间的依赖关系小,可提高代码的复用)
- 外部世界只能看到对象的部分属性
- 外部世界只能看到对象做的部分事情
类的概念
- 物以类聚,把具有相似特性的对象归到一个类中
- 类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型
- 类的对象称为类的一个实例
- 类的属性和方法统称为类成员
继承
子类通过extends关键字可以继承父类的属性和方法;
一个子类只能继承一个父类;
- 父类里的类成员在子类中无需重复定义,子类可以直接调用父类的属性和方法;(public和protected)
- 外部代码调用子类时,可以直接调用父类定义的类成员;(仅public)
- 子类可以修改和调整父类定义的类成员;
- 称之为重写,重写后,按照子类重写的功能执行;
静态
- 静态属性用于保存类的公有数据;
- 静态方法里只能访问静态属性;
- 静态成员不需实例化对象就可以访问;
- 通过static关键字定义静态属性和静态方法;
- 类的内部可以通过self或者static关键字访问自身静态成员
- 访问属性是要加上$符号;
- 通过parent关键字访问父类静态成员
- 通过类的名称在外部访问静态成员
Final
- 对于不想被任何类继承的类可以在class前添加final关键字
- 对于不想被子类重写的方法,可以在方法前添加final关键字
接口
- 不同的类,实现同一个接口时,会有不同的表现,这叫做多态
- 一个类可以实现(implements)多个接口;
- 接口的方法都为空,只需要定义方法的名称和参数;
- 实现接口的类必须有接口中定义的方法的具体实现内容;
- 接口提供了一个标准,保证多人开发时,定义的接口方法必须全部实现
抽象类
可用于有部分统一实现的方法,以及部分不同实现的方法的类
- 用abstract关键字定义抽象类和抽象方法
- 抽象类中可以包含普通方法,包含方法的实现;
- 继承extends抽象类的子类需要实现抽象类中定义的抽象方法;
魔术方法
__tostring() : 当对象被当做字符串使用时自动调用
__invoke() : 当对象被当做方法是使用时自动调用
__call($name,$arguments);$name是方法名称,$argument是参数。当对象访问不存在的方法名称时,会自动调用;
__callStatic($name,$arguments) : 定义方法时要添加static关键字。$name是方法名称,$argument是参数。当对象访问不存在的静态方法时,会自动调用
不可访问属性:属性不存在或属性访问权限为private或protected;
__get($name) : 读取不可访问属性的值时会被调用,$name是属性名称;
__set($name, $value) : 给不可访问属性赋值时会被调用,$name是属性名称,$value是设定的值;
__isset($name) : 对不可访问属性使用isset()或empty()时会被调用,$name是属性名称;
__unset($name) : 对不可访问属性使用unset()时会被调用,$name是属性名称;
__clone() : 使用clone关键字时会被调用;