OOP
面向对象是什么?
四大基本特征是什么,有什么意义
抽象,封装,继承,多态
封装
是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开,别人只能用我提供的功能实现需求,而不知道是如何实现的。增加安全性。
继承
是面向对象最显著的一个特性,继承是从已有的类中派生出新的类称为子类,子类继承父类的数据属性和行为,并能根据自己的需求扩展出新的行为,提高了代码的复用性。
多态
指允许不同的对象对同一消息做出相应。
即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。封装和继承几乎都是为多态而准备的,在执行期间判断引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
多态的优点
- \1. 消除类型之间的耦合关系
- \2. 可替换性
- \3. 可扩充性
- \4. 接口性
- \5. 灵活性
- \6. 简化性
多态的分类
方法重载实现的是编译时的多态性,而方法重写实现的是运行时的多态性。
方法重载:当多个同名方法存在时,方法名不变,但参数类型和个数不同称为方法的重载,不以返回值来区分重载。
方法重写:父类与子类之间的多态性,对父类的方法重写,若子类中的方法与父类中的方法具有相同的返回值,方法名和参数列表,则新方法会覆盖 旧方法。
参数列表相同,返回值相同,方法名相同,不能抛出新的检查异常则就是重写
参数列表的类型,个数不同,方法名相同,返回值可以相同也可以不同称为重载。可以抛出新的异常,可以有不同的访问修饰符。
以下三种方法不能实现多态:(方法不能被重写)
1、static方法,被static修饰的方法是属于类的,而不是实例的。
2、final,被final修饰的方法不能被重写
3、private和protected方法。private修饰的方法对子类不可见。而protected修饰的方法可以被子类见到,也可以重写,但是不能被外部引用。
抽象
表示对问题领域进行分析、设计中得出的抽象的概念。
是对一系列看上去不同,但是本质上相同的具体概念的抽象,在抽象用 abstract 关键字来修饰,用 abstract 修饰类时,此类就不能被实例化,从这里可以看出,抽象类就是为了继承而存在的。
如果定义了一个抽象类而不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情,用 abstract 修饰方法时,此方法就是抽象方法,抽象方法必须存在于抽象类中,抽象方法没有方法体,对于一个父类来说,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为抽象方法,抽象方法的修饰符必须为 public 或者 protected ,应为用 private,则不能被子类继承,子类便无法实现该方法,缺省情况下默认为 public 。
过程抽象和数据抽象
- 数据抽象 -->表示世界中一类事物的特征,就是对象的属性.比如鸟有翅膀,羽毛等(类的属性)
- 过程抽象 -->表示世界中一类事物的行为,就是对象的行为.比如鸟会飞,会叫(类的方法)
简述 private、 protected、 public修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
抽象类和接口的概念以及区别?
抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。
接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。
区别:
(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。
(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。
(3)抽象类中可以有构造方法,但是接口没有构造方法。
(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。
(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。
(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。
this和self、parent这三个关键词分别代表什么?在哪些场合下使用?
this 当前对象
self 当前类
parent 当前类的父类
$this在当前类中使用,使用->调用属性和方法。
self也在当前类中使用,不过需要使用::调用。
parent在类中使用。
类中如何定义常量、如何类中调用常量、如何在类外调用常量。
类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。
定义常量使用关键字const.
例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,
访问常量的格式都是类名加作用域操作符号(双冒号)来调用。
即:类名 :: 类常量名;
作用域操作符::如何使用?都在哪些场合下使用?
(1)调用类常量
(2)调用静态方法(使用static修饰的类方法)
魔术方法有哪些?
__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。