11 04 2019

PHP面向对象编程

一、面向对象基本使用

        1.1 面象对象关键字

        image.png

        1.2 实例化对象

        image.png

        image.png

        image.png

        image.png

        操作实例对象:

        image.png

        总结:

        image.png

        image.png

        1.3 访问修饰限定符

        image.png

        1.4 类的内部对象

        image.png

        image.png

        此时引出$this内置对象,在类的内部来访问成员属性和方法

        总结:在类的内部,$this代表的是对象,而$this所在的环境为类的内部的方法内部,所以能访问public、protected、private修饰符修饰的成员属性

        image.png

        image.png

        image.png

        1.5 面向对象开发规范

        image.png

        1.6 构造方法

        image.png

        image.png

        image.png

        image.png

        image.png

        image.png

        构造方法的意义:构造方法是对象实例化的时候用来初始化对象资源的,通常是用来初始化对象的属性或者其他资源

        注意:之前说的new 类名和new 类名()没有区别是因为没有构造方法,或者构造方法没有参数限定,一旦构造方法有 参数限定,new 类名就不能直接用了

        1.7 析构方法

        image.png

        定义:析构方法__destruct(),是一种类结构中的特殊方法,对象在销毁的时候会自动调用

        image.png

        image.png

        image.png

        1.8 对象传值

        image.png

        定义:对象传值,其实就是将保存的对象的变量赋值给另外一个变量,在PHP中,对象的传值是“引用传递”,两个变量指向同一个对象的内存地址,即只有一个对象。

        image.png

        1.9 范围解析操作符(类常量访问)

        image.png

        定义:范围解析操作符是由两个“::”组成的,是专门用于类实现类成员操作的,可以实现类直接访问类成员。

        image.png

        image.png

        1.10 静态成员

        image.png

        定义:静态成员,使用static修饰的类成员,表示该成员属于“类访问”,PHP静态成员有两种,静态方法和静态属性 

        ① 静态属性:在类中定义属性的时候使用static关键字修饰,访问的时候只能使用  类 + 范围解析操作符 + 静态属性访问

        image.png

        ② 静态方法:在类中定义方法的时候使用static关键字修饰,访问的时候只能使用  类 + 范围解析操作符 + 静态方法名字()访问

        image.png

        注意:任何时候访问静态成员属性、方法都要用   类名 + 范围解析操作符(::) +属性/方法,不管是在类内部还是类外部

        image.png

        image.png

        image.png

        1.11 self关键字

        image.png

        定义:self关键字是一种在类的内部(方法里面)使用,代替类名的写法,能够保障用户方便修改类名字

        ① self代替类名

        image.png

        ② self也可以在类的内部方便实例化对象,比如构造方法被私有化之后,就没有办法在类的外部实例化对象,此时可以在类的内部实例化对象

        image.png

        在类的方法内部return  new self();

        image.png

        image.png

        注意:self只能在类的内部使用

        1.12 类的加载

        image.png

        定义:类的加载本质是类的访问,必须保证类在内存中已经存在,所以需要再用类之前将类所在的PHP文件加载到内存中

        ① 手动加载:即要访问某个类之前,使用文件包含,将类所在的文件加载进来

        image.png

        注意:加载类文件是一件比较消耗资源的方式,所以有些时候不确定类是否存在内存中,可以使用class_exists()函数来判断是否存在,不存在才加载

        image.png

        ② 自动加载:PHP没有那么只能的系统自动加载,所谓的自动加载只是PHP提供了一种加载机制,即实现一个__autoload()函数,当系统需要使用类,而内存中又不存在的时候,系统就会自动调用__autoload()函数来加载类文件。

        image.png

        image.png

        1.13 对象克隆

        image.png

        定义:克隆对象clone,即通过已有的对象复制一个新的同样的对象,但是两者之间并非 同一个 对象

        image.png

        image.png

        如果不允许对象被克隆,可以将__clone()方法私有化(本质是不允许对象在外部被克隆)

        image.png

        image.png

        

二、设计模式

        2.1 单例模式

        image.png

        定义:单例模式,是一种类的设计最多只会产生一个对象的设计思想

        image.png

        image.png

        image.png

        image.png

        image.png

        image.png

        问题来了,如下:

        image.png

        image.png

        image.png

        image.png

        image.png

        image.png

        image.png


        2.2 工厂模式

        image.png

        定义:工厂模式,是指像工厂流水线一样生产对象,由一个地方生产对象,其他位置就不需要额外实例化对象,从而可以方便后期代码统一的维护。而且工厂模式下,可以方便隐藏真实的类结构,因此也更加安全。

        ① 工厂模式针对的是“相同模型”的统一产出,即工厂模式产出对象对应的类都有相同的结构或者功能,所以,首先要有一批具有类似功能的类(其实本质是同样的大类下的小类)

        image.png

        ② 以前访问这些类都需要new来实现,多处使用就多次new,如果工厂模式的话,就需要增加一个工厂类

        image.png

        ③ 上述工厂类在对象生产的时候,额外产生了一个工厂类的对象,该对象无实际意义,因此可以使用更优的方式来生产对象,即静态工厂

        image.png

        ④ 以上模式虽然也是工厂生产对象,但是是建立在使用者知道类名的情况下,而且如果原类名修改,依然需要多处修改代码,所以没有达到工厂模式的真实目的

        image.png

        image.png

        

三、面向对象高级

        3.1 面向对象三大特性

        面向对象中,三大特性有封装、继承、多态

        3.1.1 封装特性

        image.png

        定义:字面意思就是将内容装到某个容器中,并进行密封保存。在面向对象思想中,封装指将数据和数据操作捆绑到一起,形成对外界的隐蔽,同时对外提供可以操作的接口。

        数据:即要操作的数据,具体就是成员属性(属性和静态属性)和类常量,这些都是在类的内部定义,用来保存数据的

        数据的操作:即数据加工过程,在面向对象的具体体现就是方法,内部定义业务逻辑对数据进行加工处理。

        捆绑到一起:即使用类结构{}将属性、类常量和方法存到一起,成为一个整体

        对外提供可操作的接口:即提供外部访问的类成员(通常是方法)

        image.png

        image.png

        总结:封装,将数据和数据操作捆绑到一起,形成一定的隐蔽性,对外提供类中公有方法的访问

        

        3.1.2 继承特性

        image.png

        定义:继承,即有些类似的对象中,下面可以细分出一些小类,然后一些公共的特性可以在一些基础类中体现,而其他相似或者较小类可以直接使用上级类中的公共代码

        ① 继承的基础:子类  父类之间本身是一种包含与被包含关系,如此才有可继承的前提

        image.png

        ② 继承关键字:extends,子类想要继承父类,则必须在子类结构申明时使用extends关键字来继承相关类

        image.png

        ③ 继承效果:子类可以不用自己去实现某些效果,可以直接访问父类中已经存在的成员

        image.png

        image.png

        3.1.3 多态特性

        image.png

        多态实现的条件:① 必须有继承,即有子类也有父类  ② 必须有父类的引用指向子类的对象  ③ 必须有方法的重写,即子类必须对父类的某些方法根据自己的需求进行重写,方法名都是相同的

        

        image.png

        image.png


        3.2 PHP继承

        image.png

        3.2.1 继承的效果

        image.png

        3.2.2 继承的目标

        继承本质是针对同类有包含关系的共性继承,即父类通常是包含子类,子类属于父类,所以在父类中通常定义的是子类共有的一些特性成员,这是开发者默认遵循的规则

        image.png

        3.3 有限继承

        image.png

        定义:有限继承,指子类在继承父类成员的时候,并非继承所有内容,而是继承并使用部分内容

        ① 继承内容:PHP中继承是子类继承父类所有的 公有成员、受保护成员和私有成员,不能继承父类的私有方法

        image.png

        ② 受保护继承,protected关键字的产生本身就是纯用于继承的,表示允许被子类在子类的内部访问,而不允许在外部被直接访问

        image.png

        ③ 访问父类私有成员,子类要想访问父类私有成员,那么是父类提供了能够访问私有成员的接口,即提供了公有或者受保护的方法给子类访问

        image.png

        ④ 静态成员(类常量)也遵循继承规则,只是访问方式是由类进行访问

        image.png

        ⑤ 构造方法和析构方法也是可以被继承,此时需要注意子类对象实例化时对应的父类构造方法的参数

        image.png

        

        3.3 重写

        image.png

        定义:重写,即子类中定义了与父类重名的成员,子类可以重写父类任意类成员,通常重写是用来重写父类的方法,用于扩展或者更改某些业务逻辑

        ① 子类继承父类,同时子类定义与父类同名的类成员

        image.png

        ② 重写父类成员之后,子类只会直接访问子类的成员(覆盖)

        image.png

        注意:不管是公有的、受保护的属性,一旦重写,父类的就会不存在(被覆盖掉),而私有属性是不会被覆盖而丢失的

        image.png

        ③ 重写的要求1:子类重写父类的方法,控制权不能高于父类,即子类可以比父类更开放

        image.png

        ④ 重写的要求2:PHP中重写要求子类重写父类方法的时候,必须保证与父类同名方法参数一致;方法参数不单单要求数量一致,数据类型也要一致,PHP7以前对重写没有要求

        image.png

        ⑤ 重写的要求3:重写针对的是被继承的成员,父类私有方法不会被继承,因此不受要求2规定

        image.png

        ⑥ 重写是指子类拥有特殊的情况,一般是需要再父类的基础上进行扩展,此时如果想要保证父类被重写的方法继续执行(默认只访问子类重写的新方法),需要在子类重写方法的时候使用  parent 关键字

        image.png

        注意:“parent”不能访问父类的属性,可以访问静态属性、静态方法、类常量和普通方法

        image.png

        

        3.4 PHP继承的特点

        ① PHP中的继承只能是单继承,即子类只有一个父类

        ② PHP如果想继承多个类,可以使用链式继承

        image.png

        ③ PHP中继承只有私有方法不能被继承

        ④ PHP允许子类继承父类中的构造函数和析构函数

        

        3.5 静态延迟绑定

        image.png

        image.png

        image.png

        image.png


        3.6 最终类final

        image.png

        定义:最终类,使用final关键字修饰类名,表示此类不可以再被继承

        ① 基本使用

        image.png

        ② final关键字不止修饰类表示类不可以被继承,还能修饰方法,表示方法不能被重写

        image.png

        image.png

        3.7 abstract抽象类

        定义:抽象类,使用abstract关键字修饰的类,“表示该类只能被继承,不能被实例化”!!

        ①  abstract修饰类

        image.png

        ②  abstract修饰方法,abstrac修饰的方法不能有方法体,而且又抽象方法的类必须声明为抽象类

        image.png

        image.png

        ③  抽象方法因为要被子类继承实现,所以不能使用private修饰(私有的方法不会被继承)

        image.png

        image.png

        3.8 接口interface

        image.png

        定义:接口,使用interface关键字定义,与类类似,专门用来规范一些共性类必须实现的方法

        ① 接口不是类,不能实例化

        image.png

        ② 接口实现,接口是用来规范类必须完成的事情,所以“接口只能被类实现”,使用implements实现

        image.png

        ③ 接口成员,接口中只能定义公有抽象方法和接口常量

        image.png

        image.png

        image.png

        image.png

        image.png


        3.9 trait代码复用

        image.png

        定义:Trait是为类似PHP的单继承语言准备的一种代码复用机制,trait使得单继承语言摆脱为了复用而不得不继承的尴尬,让面向对象更加纯粹

        ① trait是一种类似class的关键字

        image.png

        ② trait内部可以拥有一个能拥有成员属性(包含静态),成员方法(包含静态),但不能有类常量

        image.png

        ③ trait是用来实现代码复用的,不能被实例化,也不可以被继承

        image.png

        ④ trait是用来将公共代码提供给其他类使用的,而类要使用trait的前提是加载对应的trait

        image.png

        ⑤ 一个类可以使用多个trait 

        image.png

        ⑥ 如果同时引入多个trait中有重名的方法,那么会产生冲突,解决冲突的方式是使用insteadof代替处理,以及对被替代方法使用别名

        image.png

        image.png

        


        3.10 PHP重载

        image.png

        image.png

        

        image.png

        image.png

        image.png

        image.png

        image.png

        

        image.png

        image.png

        image.png

        image.png


        3.11 foreach遍历对象

        image.png

        ① 类的外部遍历实例化对象,只能遍历共有的

        image.png

        ② 在类的内部遍历,公有的、私有的、受保护的,都可以遍历出来

        image.png