php面向对象

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复制一个对象时候调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zw621

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值