作为一个程序员,如果不熟悉面向对象简直都是一件不可思议的事情,但是小伙伴们,你们对面向对象的了解真的全面吗?我就讲一下我对面向对象的理解。
一,面向对象的概念
1,什么是对象,面向对象的英文单词是object oriented,
一切事物皆对象,就可以表示生活中方方面面的东西,都能够看做是对象,即包括,可见对象,以及不可见事物
可见事物:比如桌子,nba球员,
不可见事物:例如一些能够抽象出来的概念,也可以用作对象
2,对象的基本组成,对象包含两部分
1,对象的组成元素
是对象的数据模型,用于描述对象的数据,又被称为的对象的属性,或者是对象的成员变量
2,对象的行为
是对象的行为模型,用于描述对象能做什么事情,又被称为对象的方法
3,对象的特点
每个对象都是独一无二的
对象是一个特定事物,他的职能是完成特定功能
对象是可以重复使用的
4,面向对象的简介
(1)面向对象:在编程的时候一直把对象放在心上 (2)面向对象编程:就是编程的时候数据结构(数据组织方式 )都通过对象的结构进行存储。 使用属性和方法组织起来 (3) 为什么要使用面向对象编程? 对象的描述方式更加贴合真实世界,有利于大型业务的理解;
在程序设计的过程中用对象的视角分析世界时能够拉近程序设计和真实世界的距离。思维方式和现实世界更加贴合更加紧密
5,面向对象实质
(1)面向对象就是把生活中要解决的问题都用对象的方式进行存储--把所有的数据用属性方法表现出来。 (2)对象之间的互动是通过方法的调用完成互动
6,面向对象的思路
1,识别对象
2,识别对象的属性
3,识别对象的行为
7,面向对象的基本原则
(1)对象内部是高内聚的,即对象只负责一项特定的职能,所有对象相关的内容都封装到对象的内部,以属性和方法方式存在 (2)对象对外是低耦合的,外部世界可以看到对象的部分属性并非全部,外部世界可以看到对象可以做某些事情。。。 低耦合便于对象重用,减低依赖性
二,类的概念
类的概念:把具有相似特性的对象归类到一个类中,类定义了这些相似对象拥有的相同的属性和方法 类的对象:称为类得一个实例(instance) 类的属性和方法统称为类成员
类的实例化:1.类的定义: 给有同一 特征(属性和方法) 的事物(对象) 定义一个共同的框架 2.类的实例化:为 定义好的类 中的属性 填充数据 使之成为 独一无二的对象 的过程叫实例化 3.类的定义 和 类的实例化 是两个概念 两个过程 4.类定义时 属性值都是空的,而 对象的属性 都有具体的值5,构造函数是在实例化对象时被调用,析构函数是在程序运行完结束时自动调用对象引用的概念:当对象不再被使用的时候,会触发析构函数。也就是说当对象的所有引用都被释放了的时候三,面向对象高级1,继承类拥有部分相同的属性和方法面向对象--继承 拥有部分相同的属性和方法通过继承可以实现。集成的好处 父类里面定义的类成员可以不用在子类中重复定义,节约了编程的时间和代价。 同一个父类的子类拥有相同的父类定义的类成员,因此外部代码调用他们的时候可以一视同仁 子类可以修改和调用父类定义的类成员我们称为重写(Overwrite) 一旦子类修改了,就按照子类修改之后的功能执行在PHP中 继承的时候只能继承一个类,在子类的对象中可以直接访问父类的属性和方法2,访问控制* public 的属性和方法能通过对象直接进行访问 即 this->property * protected 的属性和方法能被子类继承 但是 不能通过对象直接访问 只能通过设置接口来访问 例如在类里面定义一个公开方法来访问这个属性 * private 的属性和方法不能被继承也不能直接被对象直接访问 也 只能通过设置接口来访问 例如在类里面定义一个公开方法来访问这个属性3,static1.静态属性用于保存类的公有数据 2.静态方法里面只能访问静态属性 3.静态成员不需要实例化对象就能访问 4.类的内部可以通过 self 或者 static 关键字访问自身静态成员 5.可以通过 parent 关键字访问父类的静态成员 6.可以通过类的名称在类定义外部访问静态成员4,final关键字在子类中编写和父类同名的方法,会对父类的方法进行重写,调用时是调用子类的方法。有关 键字final的方法不可以重写,有final关键字的类不可以被继承
1.重写父类方法:在子类中编写和父类完全一致的方法名 2.在父类方法前添加final关键字(public之前)能让其不能在子类中被重写 3.在类的class前添加final关键字能让此类不能被任何类继承final class Class(); //禁止重载类 final public function(); //禁止重载方法添加final关键字的类或方法,只是不能被重写或继承,但可以调用 备注:主要看方法名,不关心参数4,数据访问1.parent关键字 可以可用于 调用父类中 被子类重写的方法 2.self关键字 可以用于访问 类自身的 成员方法,静态成员(静态属性+静态方法) 和 类常量;但 不能用于 访问类自身的 非静态属性(非静态属性 会根据 不同的对象的赋值 而不同,非静态方法 不存在这个问题)!!! self 在 使用常量时 不需要在 常量const名称 前面添加$符号 3.static::关键字用于访问类自身定义的静态成员,访问静态属性时 需要在属性 前面 添加$符号。 4.常量属性const 不能使用对象访问,仅能使用类访问,在类本体内 可以使用“self::常量名”,在类本体外 可以使用“类名::常量名”5,对象接口接口是定义了类里面的共同行为,但是他们的实现方式的不同,所以就给出一个接口,定义一些方法,但没有具体的实现接口就是把不同类的共同行为进行定义,然后在不同的类里面实现不同的功能 、interface关键字用于定义接口,接口里面的方法不需要有方法的实现 2、implements关键字用于表示类实现某个接口 3、实现了某个接口之后,必须提供接口中定义的方法的具体实现 4、不能实例化接口 5、利用instanceof关键字来判断某个对象是否实现了某个接口 6、可以用extends让接口继承接口 7、当类实现子接口时,父接口定义的方法也需要在这个类里面具体实现 8、类的方法必需有实现,接口的方法必需为空 9. 可以用instanceof关键字来判断某个对象是否实现了某个接口 var_dump(变量 insranceof 接口)
多态相同的一行代码,对于传入不同的接口的实现的对象的时候,表现是不同的,这就是多态多态:不需要知道对象属于哪个类,只要判断该对象的类是否实现接口,就能实现调用,相同代码实现不同结果,这就是多态6,抽象类1.abstract关键字用于定义抽象类 2.在抽象方法前面添加abstract关键字可以标明这个方法是抽象方法不需要具体实现{} 3.抽象类中可以包含普通的方法,有方法的具体实现。 4.继承抽象类的关键字是extends 5.抽象类不能被实例化,继承抽象类的子类需要实现抽象类中定义的抽象方法 6.抽象类比较特殊。但是它和接口一样。不能直接把对象实例化。通过共性来规范化类。