面向对象,在高级编程语言中可谓是占了很大的比重的。就算是只做CRUD的工作,只做简单的使用框架进行编程,我们程序员也在无时无刻的接触着面向对象。
PHP当然也是有面向对象的。而且在各种框架中,大量使用了面向对象编程。所以,我们在这里重新学习一遍面向对象。
在这里学习了面向对象之后,对于我们后续学习其他编程语言(例如:Java、golang、python、rust等)的时候在涉及到面向对象的学习的时候会有很大帮助。到那个时候,我们还会反复学习面向对象很多次,而且在程序员的整个职业生涯中,面向对象都将是程序员的忠实伴侣,一直伴随你的整个职业生涯。
在这里学习了面向对象也是在为我们后续学习设计模式打下基础。
那就,开始吧!
以下内容是我从菜鸟教程中复制的。
面向对象(Object-Oriented,简称 OO)是一种编程思想和方法,它将程序中的数据和操作数据的方法封装在一起,形成"对象",并通过对象之间的交互和消息传递来完成程序的功能。面向对象编程强调数据的封装、继承、多态和动态绑定等特性,使得程序具有更好的可扩展性、可维护性和可重用性。
在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。
对象的主要三个特性:
- 对象的行为:对象可以执行的操作,比如:开灯,关灯就是行为。
- 对象的形态:对对象不同的行为是如何响应的,比如:颜色,尺寸,外型。
- 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态。
面向对象编程的三个主要特性:
- 封装(Encapsulation):指将对象的属性和方法封装在一起,使得外部无法直接访问和修改对象的内部状态。通过使用访问控制修饰符(public、private、protected)来限制属性和方法的访问权限,从而实现封装。
- 继承(Inheritance):指可以创建一个新的类,该类继承了父类的属性和方法,并且可以添加自己的属性和方法。通过继承,可以避免重复编写相似的代码,并且可以实现代码的重用。
- 多态(Polymorphism):指可以使用一个父类类型的变量来引用不同子类类型的对象,从而实现对不同对象的统一操作。多态可以使得代码更加灵活,具有更好的可扩展性和可维护性。在 PHP 中,多态可以通过实现接口(interface)和使用抽象类(abstract class)来实现。
面向对象内容
- 类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
- 对象 − 是类的实例。
- 成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可成为对象的属性。
- 成员函数 − 定义在类的内部,可用于访问对象的数据。
- 继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
- 父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
- 子类 − 一个类继承其他类称为子类,也可称为派生类。
- 多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
- 重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
- 抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
- 封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
- 构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
- 析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
下图中我们通过 Car 类 创建了三个对象:Mercedes, Bmw, 和 Audi。
$mercedes = new Car ();
$bmw = new Car ();
$audi = new Car ();
基本概念
- 用class关键字定义类
- 在类中可以定义类的成员变量
- 在类中可以定义类的函数方法
- 类中的成员变量、函数方法的访问控制都是用public、private、protected进行控制
- PHP的类继承是单继承,也就是一个类只能继承一个父类,继承的关键字是extends
- 在PHP中创建一个对象用new关键字
$google=new Google;
7. 用对象调用类的成员方法是用箭头(->)进行调用 8. 构造函数是在对象创建的时候自动调用的,如无必要,不用显示调用,在构造方法中为对象的成员变量附初始值。其实在实际编程中,我还会为全局都会使用的成员变量完成对象的创建 9. 析构函数和构造函数相反,是在对象销毁的时候调用,程序会自动调用,不用显示调用 10. 如果从父类中继承的方法不能满足需要,那么可以在子类中定义一个同名的方法实现对继承自父类的方法的重写(override) 11. 接口:使用interface关键字,指定类需要实现的接口用关键字implements。 12. 在接口中定义了一些没有具体实现的函数。实现该接口的类必须将接口中定义的所有方法都实现一遍,如果不需要实现某一个方法可以用一个空方法,但是必须实现接口中规定的所有方法 13. 类可以实现多个接口,没有数量限制
抽象类
- 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
- 定义为抽象的类不能被实例化。
- 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
- 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
- 子类方法可以包含父类抽象方法中不存在的可选参数。也就是说如果在父类中定义的抽象方法没有参数,在子类中定义的方法是可以携带参数或者多于父类中的参数的
static关键字
- 声明类属性和方法,就可以不实例类而直接访问,用类名称加双冒号(::)的方式访问静态属性和方法
User::getUserNameByOpenid($openid);
- 伪变量 $this 在静态方法中不可用
- 可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static
final关键字
- PHP5之后版本支持
- 如果父类中一个方法被定义为final方法,则子类无法覆盖此方法
- 如果一个类被声明为final类,则不能够被继承
调用父类的构造函数
- PHP不会在子类的构造方法中自动调用父类的构造方法
- 如果要调用父类的构造方法,需要显示的在子类的构造方法中通过 parent::__construct() 进行调用
以上为从菜鸟教程中简化总结出来的,如果想看完整教程可以去菜鸟教程看。