类使用:
1、实例化对象
2、调用静态成员
3、作为其它的基础类,被继承。
两种特殊的类,功能单一:
1.只能实例化对象,不能被继承。
final类
最终,在继承链条上,最末的一个类,
其下不能再出现子类,意味着不能被继承。
final方法
final关键字还可以显示方法!
2.只能被继承,不能实例化对象。
抽象类(abstract):
不完整的类;由于包含了不完整的方法,
不完整的方法,也叫抽象方法:
没有方法体的方法,
只有方法的声明,没有方法的实现。
意义在于哪里?
注意:
由于是重写父类的方法,因此受重写规则限制(比如:访问级别,参数)
抽象类中可以存在正常成员,也是可以被子类所继承的。
允许出现没有抽象方法的抽象类,意义在于仅仅限制该类不能被实例化。
继承抽象类的子类:
接口:
对象的公共方法。
也有一种接口技术,定义一个接口结构,
用于限制一个类(对象),因该具备的公共方法。
interface:声明一个接口的结构:
细节注意:
接口内只能包含,公共的抽象方法(不完整的方法)
使用:
使用一个类,来实现,接口内所定义的所有接口方法;
实现,使用implements。
实现该接口结构类,就包含了接口中定义的抽象方法,
两个选择:
1.定义抽象类
2.实现接口方法
抽象类和接口的区别:
1.抽象类和普通类之间是继承关系。
普通类继承抽象类,第一得到抽象类中的已有的常规成员,
第二,需要实现抽象方法
2.接口和普通类之间是实现关系。
普通类实现了接口,只能将其没有实现的公共方法实现。
接口只用于定义公共方法
多实现:
一个普通类,实现多个接口
语法:
class a implements inter_1,inter_2{
}
interface inter_1{
}
interface inter_2{
}
接口里面可以定义常量。
接口可以相互继承。
检测类的系统函数:
class_exists();判断一个类是否存在,值类型是bool;
项目中如何管理大量类的定义?
典型,每个类,独立的创建一个文件,
用户保存定义该类的源代码,
使用时将该文件载入即可。
此时,类文件的命名为:
类名.class.php;
类文件载入:
现代载入类文件的方式:
按需加载:
在需要某个类时,如果该类没有被加载,
则加载定义该类的类文件。
1.判断当前类是否已经加载
2.该类在那个文件中。
3.什么时候加载?
可以使用php的类文件,自动加载机制完成。
自动载入:
当需要一个类,当时并没有找到该类的定义,
此时,php核心,会自动尝试调用 autoload()函数,
与此同时,会将当前所需要的类名作为参数,传递
到autoload()这个函数中。
默认没有__autoload()函数,所以需要自定义__autoload
自动加载机制的大提前:
必须要能够通过类名,推导出,类定义所在的文件才可以。
类文件 = 函数(形参类名)
序列化,反序列化:
举例说名:
数据持久性保存:
把php的类型数据保存到操作系统的文件里。
使用的系统函数:
serialize() 序列化
file_put_contents(), 向文件写入数据
file_get_contents() 向文件输入数据
unserialize() 反序列化
序列化:
前提:
只有涉及到,php的数据需要被,存储到操作系统文件。
需要对数据进行序列化。
原理:
通过serialize(),把php的数据,转换成操作系统可以识别的数据,
按照序列化的字符格式,进行保存。
php全部的数据类型,只有资源不能被序列化,反序列化。
反序列化:
前提:
被序列化的php数据从操作系统文件传输到php文件时。
原理
通过unserialize(),把序列化的php数据,转换成php原生类型的数据。
对象的序列化和反序列化:
1.在对象被反序列化时,是需要找到对象所在的类的声明才可以,如果没有找到,则变成一个
__PHP_Incomplete_Class类的对象
2.反序列化,也会触发自动加载机制
3.在序列化时,可以自定义需要序列化的属性名单。
通过对象的特殊方法__sleep()
该方法会在对象被序列化时,自动调用,不需要参数,
需要返回一个数组,每个元素表示一个属性名;数组内
存在的属性名就会被序列化,反之不会。
4.在反序列化时,可以自动再次执行某些代码,从而完成某些资源初始化
通过特殊方法:
__wakeup()
魔术方法:
__construct() 构造方法
__destruct(); 析构方法
对象的拷贝:
对象之间的赋值:只有引用传递,没有值传递。
保存对象的变量内,保存的不是对象本身,而是对象标识;
导致结果,不能通过赋值的方式,使用旧对象,得到新对象。
对象的克隆:
clone
语法:
克隆对象 clone 实例化对象名
克隆的前提,是基于实例化对象,对象没有实例化,是不能克隆的。
克隆和实例化新对象的区别:
克隆:把实例化对象克隆出来,克隆出来的对象和实例化对象的属性,方法是一样的。
通过类得到对象,自动执行:__clone()
实例化新对象:把类实例化。
通过类得到对象,自动执行:__construct()
1.SingleTon
单例设计模式:
作用:
是适用于使用一个对象可以完成所有业务逻辑的类。
对象的魔术方法:
__invoke
php实现匿名函数,不可缺的部分
__toString
将对象当字符串去处理时,会自动调用该对象的__toString()
2.重载(overload):
它只是一个现象
概念:
指的是php对当前对象的不可访问成员的处理方式。
不可访问成员:
1、不存在
处理方式:
自动增加为公共的属性
2、受到访问控制,访问不到成员。
__set() 严格限制对象结构,和批量处理可以被修改的属性。
__get():
当访问一个不可访问的属性时,会自动
__unset()
当试图删除一个不可访问属性时,则会自动调用该对象的__unset()方法
__isset()
在判断一个不可访问的属性是否存在时,则会自动调用
此函数需要返回true,或者false
方法重载的魔术方法:
__call()
当调用了对象的不可访问方法时,会自动执行,来处理
__callStatic()
当重载静态方法时会执行!
静态延迟绑定:
将确定当前类的时期,有类编译时,
推迟到类中方法被调用,可以更好来表示当前类。
1,$this是永远代表所在类对象么?
不是,$this的确定决定于当前方法的执行环境!
2,self是用于代表所在类么?
是,就是所在类!
3,static和self的区别:
self: 用于代表所在的类!self的值已经确定的!(编译时确定)
static: 当前类,由方法 被调用时,才确定谁(那个类)才是当前类!(调用时)
static三个用途:
1.声明静态局部变量
2.声明静态成员
3.代替当前类,当前执行类。
代替类的关键字:
self
static
parent
类型约束:
约束函数,或者方法参数的数据类型,只能是某个类的对象。
对象的遍历:
使用 foreach
自定义遍历:
接口编程:
iterator()
迭代器接口可以自定义遍历
常用的对象,类函数:
is_object()
class_exists()
interface_exists()
get_class()
get_parent_class()
get_class_vars(); 得到类的属性
get_class_methods(); 得到类的方法
get_declared_classes(); 得到所有已经定义的类
incomplete_Class
魔术常量:
__CLASS__ 当前类名,
__METHOD__ 当前方法名
__FUNCTION__ 所在的函数
__METHOD__ 类的方法
__FILE__ 文件所在的路径
__DIR__ 路径
反射reflection:
主要用来的到某种结构(类,函数,方法......)的内部结构信息的一种工具。
函数:export()
代理执行:
:
ReflectionClass('类名');
ReflectionMethod('方法名')
代理执行的优势:
可以管理大量的位置的类。