PHP 学习之路:第二十四天——oop 面向对象编程

164 阅读4分钟

一、面向对象的概念

1.1 什么是面向对象(object oriented)

  • 世间万物皆对象,抽象的也是对象,一切可见或不可见都是对象,面向对象是一种以对象为基础的编程思想(自下而上)

  • 面向过程是一种以过程为中心的编程思想:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现(自上而下)

1.2 对象的基本组成

  • 对象的组成元素:是对象的数据模型,用于描述对象的数据,又称为对象的属性,或者对象的成员变量.
  • 对象的行为: 是对象的行为模型,用于描述对象能够做什么事情,又被称为对象的成员方法.

1.3 对象特点

  • 每一个对象都是独一无二的
  • 对象是一个特定的事物,他的职能是完成特定功能
  • 对象是可以重复使用

1.4 面向对象简介

  • 面向对象编程就是编程的时候数据结构(数据组织方式 )都通过对象的结构进行存储,使用属性方法组织起来

1.5 面向对象的实质

-面向对象就是把生活中要解决的问题都用对象的方式进行存储--把所有的数据用属性、方法表现出来。对象之间的互动是通过方法的调用完成互动

#二、面向对象的基本实践

2.1 类的概念

  • 物以类聚,把具有相似特性的对象对垒到一个类中,类定义了这些相似对象拥有的相同的属性和方法
  • 类是相似对象的描述,成为类的定义,是该类对象的蓝图或者原型
  • 类的对象称为一个类的实例(Instance)
  • 类的属性和方法统称为类成员

2.2 类的实例化

  • 类的实例化:通过类定义创建一个类的对象
  • 类的定义属性值都是空或默认值,而对象的属性都有具体的值

2.3 类的定义

  • 类的定义以关键字class开始,后面跟着这个类的名称。类的命名通常每个单词的第一个字母大写,以中括号开始和结束
  • 类的实例化为对象时使用关键字newnew之后紧跟类的名称和一对圆括号
  • 对象中得成员属性和方法可以通过->符号来访问

三、面向对象的高级实战

3.1 对象的继承

父类:拥有部分相同的属性和方法
继承的好处:

  • 父类里面定义的类成员可以不用在子类中重复定义,节约了编程的时间和代价;
  • 同一个父类的子类拥有相同的父类定义的类成员,因此外部代码调用他们的时候可以一视同仁;
  • 子类可以修改和调用父类定义的类成员我们称为重写(Overwrite), 一旦子类修改了,就按照子类修改之后的功能执行;

子类

  • 子类可以通过$this访问父类的属性
  • 子类的对象可以直接调用父类的方法和属性
  • PHP单继承特性:类不允许同时继承多个父类(extends后面只能跟一个父类名称)

3.2 访问控制

面向对象的三种访问权限:

  • public是公有的类成员,可以在任何地方被访问,可以被类以及子类或者对象都可以访问;
  • protected受保护的类成员,可以被其自身以及继承的子类访问,可以被子类继承,但是不能被对象访问,只能通过封装的方式让对象访问;
  • private私有的类成员,只能被自身访问.不能被子类继承,也不能被对象访问,只能在自身通过封装让外界访问(例如在类里面定义一个公开方法来调用私有属性);

3.3 Static(静态)关键字

静态成员:定义时在访问控制关键字后添加static关键字即可(访问控制关键字:public. protected. private)

  • 静态属性用于保存类的公有数据,可以在不同对象间共享
  • 静态方法里面只能访问静态属性
  • 静态成员不需要实例化对象就可以访问
  • 类的内部可以通过 self::static:: 关键字访问自身静态成员,self::$属性 self::方法()
  • 通过 parent:: 关键字访问父类的静态成员,也可以通过子类::父类静态成员
  • 通过 类名:: 的方式在类的外部访问静态成员

3.4 重写和Final关键字

  • 子类中编写跟父类完全一致的方法可以完成对父类方法的重写,方法参数最好有默认参数
  • 对于不想被任何类继承的类可以在class之前添加final关键字
  • 对于不想被子类重写(overwrite, 修改)的方法,可以在方法定义前面添加final关键字

3.5 数据访问

  • parent关键字可以可用于调用父类中被子类重写了的方法
  • self关键字可以用于访问类自身的成员方法,静态成员和类常量;不能用于访问类自身的属性!!!使用常量的时候不需要在常量const名称前面添加$符号
  • static::关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性前面添加$符号。
  • 常量属性const不能使用对象访问,仅能使用类访问,在类本体内可以使用“self::常量名”,在类本体外可以使用“类名::常量名”