面向对象OOP--PHP

作者:烨竹

对面向过程,面向对象编程思想的理解
面向过程:

以过程为中心,将所要解决问题,分解成一步一步的,再使用函数进行封装,封装之后再按过程上的步骤进行依次调用
面向对象:
是功能进行划分,将不同的功能划分不同的主体上,再调用相应主体上的动作(功能)

类与对象

类:从众多事物中提取共性(共同的特点),形成一个具有描述性的概念
对象:对象就是类中一个具体的事物
类语法:class 类名{
//类成员
}
实例化语法:new 类名【()】;
类可以理解为图纸,而实例化则是由类得到一个实际的物体的过程

类成员:

类成员是用于描述由类产生的身上所能调用的属性与功能。
类成员以分为以下两大类:普通类成员、静态类成员
普通类成员:属性、方法、常量
静态类成员:静态属性、静态方法
静态方法和实例化方式的区分是为了解决模式的问题,举例子:比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的
属性(包括普通和静态成员):访问修饰控制限定符,包含三种:public是公开的;private私有的;protected受保护(可以继承)
成员方法:【访问修饰控制限定符】 function 方法名(){
//方法体
}
类常量:const
静态方法:static


面向对象OOP--PHP_第1张图片

成员的访问

public修饰的方法 类外类内都可以调用
private、protected修饰的方法 只能在类内使用$this调用,$this代表对象
常量的访问:类名::常量名;在类内访问常量需要使用self关键字;类内的self就代表这个类;
访问静态属性必须加$;不加则为访问常量


面向对象OOP--PHP_第2张图片

(1)、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里,调用方法为"类名::属性名";
(2)、静态方法不能调用非静态属性;因为非静态属性需要实例化后,存放在对象里;
(3)、静态方法可以调用非静态方法,使用 self 关键词;php里,一个方法被self:: 后,它就自动转变为静态方法;
(4)、调用类的静态函数时不会自动调用类的构造函数

成员访问相关函数:

构造方法__construct和析构方法__desctruct()
简单理解:造方法是对象创建完成后第一个被对象自动调用的方法,这是我们在对象中使用构造方法的原因。而析构方法是对象在销毁之前最后一个被对象自动调用的方法,这也是我们在对象中使用析构方法的原因。所以通常使用构造方法完成一些对象的初始化工作,使用析构方法完成一些对象在销毁之前的清理工作。

php中可以使用&符号,将对象默认的赋值传值,更改为引用传值

克隆
克隆函数:clone(对象名);
克隆方法__clone()

判断:instanceof

面向对象三大特性:封装,继承,多态

封装:计算机中的封装,就是对外隐藏内部实现的细节,对外仅公开接口,通过public、private、protected、final、static等关键字。来限制属性或方法的访问等级;
封装并不是一种语法,就书写一个类的过程时,对属性的一种设计思想;
继承:面向对象语言最大的一个功能就继承。继承表示的是一种能力。在创建一个类时,无需添加任何代码就可以拥有已存在的类的功能。
还可以在不更改现有的类的代码而进行功能的扩展。
语法:
class ClassName extends AnotherClass {
}
parent关键字,主要用于当子类中重写了父类的方法时,又想在子类中调用父类中被重写的方法,就可以使用parent指向父类
多态:多态就是多种形态,体现在代码就是同一个公开的方法多个内部实现,简单理解就是不同对象做一件事得到不同结果。


面向对象OOP--PHP_第3张图片

两种特殊的类:一个类只能被继承、一个类只能被实例化。

抽象类与抽象方法:只能被继承不能被实例化(abstract)
abstract class 类名{成员}
抽象方法不能是private修饰,原因抽象类中的抽象方法就是为了被继承,如果声明为private子类无法使用。


面向对象OOP--PHP_第4张图片

接口:只包含抽象方法与常量的抽象类可以定义为接口
语法:
interface 接口名{
接口成员
}
接口不是类,只能被类实现(implements),
接口虽然不能被类继承,但是接口可以继承接口。


面向对象OOP--PHP_第5张图片

最终类与最终方法:不允许其他的类来修改本类的代码(final)
语法:
final class 类名{
//类成员
}

重载:

PHP中没有真正意义的重载;php中的重载指的是对一个非公开,或不存在的属性或方法的一种处理方法。
属性重载:
__get():没权限访问时候自动调用( 访问私有属性 )
__set(): 无权操作的属性赋值时, 或不存在的属性赋值时, __set()自动调用(方法用来设置私有属性)
__isset() : 用isset() 判断对象不可见的属性时(protected/private/不存在的属性) 会引发 __isset()来执行
方法重载:
__call():作用:在调用对象中不存在的方法时,就会出现系统报错,然后退出, 声明时候自动调用:就是在调用一个对象中不存在的方法时自动调用(处理一些不存在的方法的错误调用,需要两个参数,具体的看api)
__callStatic:调用一个不存在的静态方法的时候自动调用
__toString():时机:将一个对象当作字符串输出的时候自动调用(直接echo 对象)。必须return

自动加载:

__autoload()函数:实例化对象时,自动调用(其它的魔术方法都是在类中添加起作用,这是一个唯一一个不在类中添加方法的,只要在页面中使用掉一个类,只要用到这个类名,就会自动将类名传给这个参数)
spl_autoload_register(fun);将我们自己定义的加载函数,注册到php的自动加载机制中


面向对象OOP--PHP_第6张图片

设计模式

所谓的设计模式,就是具有多年开发经验的,开发者,在开发的过程中,为了解决某个需求,而形成的一套代码方案
单例模式:就是单一的实例,一个类永远只能产生一个实例


面向对象OOP--PHP_第7张图片

工厂模式:一个负责其他类的实例化工作


面向对象OOP--PHP_第8张图片

工厂单例模式:并不是工厂类是单例,而是通过工厂类所创建的其他的类实现单例
面向对象OOP--PHP_第9张图片
2..png

命名空间:

namespace 空间名\空间名;
use \空间名\空间名
空间成员的访问
①、非限定
语法:
空间成员;
说明:
空间成员前什么都不加。
非限定只能访问当前空间中的成员。
②、限定
语法:
空间名\空间名\空间成员
说明:
只能访问当前空间的子空间中的成员。
③、完全限定
语法:
\空间名\空间名\空间成员
说明:
可以访问任意空间中的成员
 对于空间成员的访问,掌握以下几点:
 当前空间 所要访问的空间成员所在的空间
 当前空间与所访问的空间成员在同一个空间 直接写成员名
 所访问的空间成员是当前空间的子空间 限定
 访问其他空间的成员 完全限

数据保存:

程序语言中数据划分多种类型,数据有两种方面组成,其一是数据的值,其后是数据的类型。
程序在运行的过程中,数据是保存在内存中的变量中的,只程序运行结束,数据就会被销毁。
为了保存程序在运行过程上的产生的数据,我们可以将数据保存在文件中。如果数据比较简单可以选择文件进行保存。
如果使用文件保存数据,由于文件文件中只能保存字符串。
为了能够将数据的类型与值一同保存起来,所以需要使用序列化
序列化
序列化就是将数据转换为一种能够即可以表示类型又可以表示值的字符串。
serialize(变量);将指定的变量中的数据进行序列化
反序列化
unserialize(string);
string是序列化后的字符串。
是对string进行返回序列化。
对象的序列化与反序列化:
__sellp:将对象转换为字符串用于持久存储(使用serialize 将对象串行化的时候会自动调用,串行化一个对象将会保存对象的所有属性变量和类名信息,但是不会保存对象的方法)
__wakeup:使用unserialize 将字符串还原为对象的时候会自动调用

反射机制

反射(Reflection)一词形象说明一个类的作用;获取所服务的类所有的信息,与一个类相关的信息

反射类
①、export方法
ReflectionClass::export(类名或对象)
说明:
用于返回一个类相关成员的描述


面向对象OOP--PHP_第10张图片

②、反射对象
ReflectionClass即然是一个类也可以被实例化。
语法:
$ref = new ReflectionClass(类名或对象);
说明:
用于实例化一个反射对象


面向对象OOP--PHP_第11张图片

异常:

异常处理语法:
try{
//try语句块
throw(异常对象);
}catch(异常类 $e){
//异常处理块
}catch(异常类 $e){
//异常处理块
}
说明:
在try语句块中尝试捕获与catch后的异常类对应的异常对象,将异常对象捕获到$e这个变量中。

你可能感兴趣的:(面向对象OOP--PHP)