博客列表 >面向对象的概念(老师版)

面向对象的概念(老师版)

逃逃
逃逃原创
2021年08月16日 02:23:393234浏览

一、面向对象的概念

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

  • 世间万物皆对象,抽象的也是对象,一切可见或不可见都是对象,面向对象是一种以对象为基础的编程思想(自下而上)
  • 面向过程是一种以过程为中心的编程思想:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现(自上而下)

1.2 对象的基本组成

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

1.3 对象特点

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

1.4 面向对象简介

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

1.5 面向对象的实质

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

二、面向对象的基本实践

2.1 类的概念

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

2.2 类的实例化

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

2.3 类的定义

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

三、面向对象的高级实战

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::常量名”,在类本体外可以使用“类名::常量名”

3.6 对象接口

接口就是把不同类的共同行为进行定义,然后在不同的类里面实现不同的功能

  • interface定义接口,implements用于表示类实现某个接口
  • 接口里面的方法没有具体的实现,无{}
  • 实现了某个接口的类必须提供接口中定义的方法的具体实现
  • 不能实例化接口,但是能够判断某个对象是否实现了某个接口。instanceof关键字判断某个对象是否实现了某个接口 $object instanceof interface
  • 接口可以继承接口(interface extends interface
  • 接口中定义的所有方法都必须是公有,这是接口的特性

3.7 多态

因为接口的方法实现可以有很多,所以对于接口里面定义的方法的具体实现是多种多样的,这种特性我们称为多态

不需要知道对象属于哪个类,只要判断该对象的类是否实现接口,就能实现调用,相同代码实现不同结果

形象点说就是同一个接口,不同的对象实现,得出的结果不一样就是多态,如传入的是人类对象,得到的是人类吃苹果,传入的是猴子对象,得到的就是猴子吃香蕉。相同的一行代码,对于传入不同的接口的实现的对象的时候,表现是不同的。

3.8 抽象类

接口里面的方法都是没有实现的,而类里面的方法都是有实现的. 有没有一种形态,允许类里面一部分方法不实现呢?

  • 当接口中的某些方法对于所有的实现类都是一样的实现方法,只有部分方法需要用到多态的特性

  • 如人和动物吃东西是不同的,但是呼吸是相同的,不需要为人和动物分别实现呼吸的功能

  • abstract 关键字用于定义抽象类
  • 在抽象方法前面添加 abstract 关键字可以标明这个方法是抽象方法不需要具体实现{}
  • 抽象类中可以包含普通的方法,有方法的具体实现
  • 继承抽象类的关键字是 extends
  • 继承抽象类的子类需要实现抽象类中定义的抽象方法
  • 抽象类不能被实例化,当子类继承抽象类的时候,所有的抽象的方法都必须定义

四、PHP 面向对象的特殊实践

4.1 魔术方法之_toString()和 invoke()

  • toString()当对象被当作 String 使用时,这个方法会被自动调用(需要在类中定义tostring()方法。调用 echo $object
  • invoke()当对象被当作方法调用时,这个方法会被自动调用(需要在类中定义invoke()方法)。调用 $object($parameter)

4.2 魔术方法之call()和callStatic()

__call()方法:当对象访问不存在的方法名称时,此方法自动调用。

  • 调用示例:public function __call($name,$argument){}
    注意:访问控制关键字必须为 public;必须有两个参数:对象访问的方法名称($name)、方法包含的参数($argument ==> 自动转换成数组)。

__callStatic()方法:当对象访问不存在的静态方法名称时,此方法自动调用。

  • 调用示例:public static function callStatic($name,$argument){}
    **注意:同
    call();此方法为静态方法(static)。**

这两种方法也被称为方法的重载(overloading)

  • 注意区分重写(overwrite)
  • 通过这两个方法,同一个方法的调用可以对应不同的方法的实现(同一个方法的静态调用、动态调用对应不同的方法实现)

总结

  • class: 类声明
  • new: 类实例化
  • public: 公开成员,随处可见
  • protected: 受保护成员,仅在当前类或子类中可见
  • private: 私有成员, 仅在当前类可见
  • spl_autoload_register(): 自动加载器
  • extends: 类的扩展
  • static: 声明类的静态成员
  • $this: 实例引用
  • self: 类的引用
  • trait: 类功能横向扩展
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议