概念理解:
1:类是对一类事务的统称
定义类的三大成员:
定义属性(变量)
定义方法(函数)
定义类常量(常量)
2:类有属性和方法
3:对象是类中的一个个体
4:方法就是函数、属性就是变量
5:类的定义和使用
6:类的实例化的理解
对于类来说,使用之前要先实例化,如:
$类变量名 = new 类名(参数 1,参数2...);
类为什么要实例化,类是一个抽象的群体,只有实例化了才能得到一个具体的个体。类的实例化结果就是对象
配电脑,电脑配置清单就是类,用这个配置清单配置出来的机子就是对象
7:对象访问成员
$对象名->属性名
$stu->stu_name="z";
8:对象访问方法
$stu->payMoney();
9:判断一个对象是否属于是由某个类实例化而来
对象变量 instanceof 类名
10:为什么打印var_dump一个对象的时候只有属性被打印出来
实例化对象的属性都会单独在内存开辟一个新的内存空间,不同对象之间的属性由各自所属的对象进行管理,但是方法只有一份。
属性归对象管理
方法归类管理
属性不能在方法内直接方法,需要找到所属的对象才能访问,典型的做法是,在方法内使用$this代表当前被调用的那个对象
10:构造方法:通常实例化完一个对象后,都要对对象的属性进行初始化操作才有意义!为什么要初始化,不初始化就像一个人,没有属性没有方法。初始化就是赋值。
只有类,没有对象,没有具体的实体。所以要实例化来实例出具体的对象
只有对象,没有属性,也就没有本身自有的特征,需要对对象的属性进行初始化操作
第一种初始化:$stu1->stu_name='张三'; $stu2->stu_name='张三';
缺点:这样极不方便、代码冗余
第二种初始化:先然后创建能初始化对象属性的方法 public function init($n,$a,$m){$this->stu_name=$n;------}
缺点:每次实例化一个对象的时候都要手动调用init方法才能对对象进行初始化。我们想做到的是在实例化一个对象的时候自动的调用初始化属性的方法
$stu1->init('张三',21,1888);$stu2->init('李四',22,1888);
第三种方法:构造方法,实际上在我们实例化一个对象的时候系统自动的调用__construct()方法
//构造方法
public function __construct($n,$a,$m){
$this->stu_name='$n';
$this->stu_age='$a';
$this->stu_money='$m';
}
//实例化一个学生对象
$stu1=new student('张三',24,12000);
$stu2=new student('李四',21,15000);
11:析构方法,只为释放资源。
public function __destruct(){mysql_close($this->link);}
12:析构方法、构造方法统称为魔术方法
13:对象的传值(值传值和引用传值效果一样)
a:对象的值传递,对象的变量名不是直接引用改对象的内存地址空间,而是引用了对象内部的编号,值传递的时候,复制的其实是对象的内部编号
b:对象的引用传值,直接引用原对象的内部编号
当我们使用$stu2=$stu1,再重新赋值$stu2->stu_name='李四'的时候会改变原对象的属性值,因为操作的是同一个属性内存地址,
14:对象的克隆(对象的赋值无法创造新的对象,所以产生了克隆)
a:所谓的克隆,不是通过类的实例化得到一个新的对象,而是通过一个已有的对象得到一个新的对象!
b:新对象 = clone 已有的对象
c:克隆出的对象与原对象有相同的属性,但是占用不同的内存存储空间
d:克隆不会触发构造方法,克隆是根据原有的对象复制而来,构造方法是实例化一个新的对象的时候触发
e:怎么区分新旧对象
用__clone()
在克隆的时候会自动的调用该魔术方法,负责对新对象进行相关的初始化工作!
15:静态成员(静态属性、静态方法),所有的对象所共享的成员!而对象又是类来管理的,所以静态成员是由类来管理
16:静态属性
a:定义语法:public|protected|private static属性名
b:访问语法:类::静态属性名
注意:这里的静态属性名要加上$符号,比如Student::$stu_age,主要是和以后的类常量相区分!
c:无法使用一个静态对象直接访问静态属性,因为不单独属于某个对象
d:使用类访问静态属性,使用对象访问非静态方法!在类的内部用self::静态属性,仅仅在类的内部
17:静态方法,所有对象共享的方法
a:定义语法 public|protected|private static function f2(){}
18:静态方法和非静态方法,在内存中都只有一份,无非一个共享一个独有。但是非静态方法可以用$this.类调用静态成员,对象调用非静态成员
19:类常量 属于某一个类
a:语法定义 :const CLASS_ID='618';不能加访问控制修饰符,也不受访问控制的限制
b:访问语法 :类名::常量名
c:当前类的内部访问类常量可以用类名也可以用self
现在总结下类中的成员:
静态属性、类常量 类空间(为类所有)
非静态属性 对象空间
静态方法、非静态方法 用户代码区
20:类文件的自动加载
a:需要引入一个文件的时候,include引入,该类文件的命名方式为:类名.class.php。
b:多个文件引入,将多个文件先引入到一个文件,再引入这个文件。问题是会引入不必要的类,我们要自动、按需加载引入
c:自动加载的主要的规则就是:类名和类的定义文件一定要有关联,也就是说,我们要保证能够通过类名找到类所在的类文件才行!
21:自动加载机制
PHP在执行的时候,如果发现需要一个类(只要是和这个类相关的任何的操作),而当前脚本又没有该类的定义代码也没有载入该类的类文件,那么PHP系统会自动的调用一个名字叫作__autoload()的一个函数!调用的时候,会给该函数传递一个参数,该参数就是为当前需要的类的类名!
22:注册其他的自动加载函数
情况:加载的文件里又有一个自动加载函数
处理措施:
第一步:定义一个可以加载类文件的普通函数
第二步:将该普通的函数注册成自动加载函数 spl_autoload_register(‘函数名’);
函数的注册一定要发生在需要某个类之前!
可以注册多个自动加载函数,在载入成功之前,会依次的按注册的顺序执行,直到找到为止!一旦找到所需的类文件,就不再继续执行其他的注册了的自动加载函数了!
一旦注册了其他的自动加载函数,那么系统默认的__autoload()函数就失效了!如果想继续使用,必须像注册其他普通函数一样,重新的进行注册!
23:注册非静态方法
a:实例化一个对象出来
b:spl_autoload_register函数的参数为一个索引数组,该数组里面只有两个元素,第一个元素为一个对象变量,第二个元素为方法名!
24:注册静态方法
spl_autoload_register函数的参数为一个索引数组,该数组里面只有两个元素,第一个元素为一个类名,第二个元素为方法名!
25:数据的序列化与反序列化
写进去的数据,读出来会转换,写进false,显示0读出空字符串
序列化--serialize($data):将原始数据转换为用于保存和传输的字符串数据(不仅仅记录原数据的值,还记录原数据的类型等相关信息)
反序列化--unserialize($data):将序列化之后的字符串数据,根据其记录的值和类型等相关信息,转换为原始数据!
26:__sleep()
序列化一个对象的时候由系统自动调用,用于规定哪些属性应该被序列化,返回一个索引数组,数组内的元素为需要被序列化的属性名的集合!
27:__wakeup()
在反序列化一个对象的时候自动触发!
作用:就是在反序列化一个对象的时候,对该对象进行一系列的初始化操作!
28:类的继承
继承:体现出类与类之间的共性与个性的关系,一个类从另一个已有的类获得其成员和特性,就是继承!
a:子类实例化出来的对象也同时是其父类的一个实例
b:父类的属性和方法都可以被继承
几个概念
继承:一个类从另一个已有的类获得其成员和特性,就是继承!
派生:从一个已有的类产生一个新的类,叫作派生!
注意:继承和派生其实是从不同的方向来描述的一个概念,本质上是一样的!
父类:也叫作基类,就是指以后的那个被继承的类
子类:也叫作派生类或扩展类
扩展:在子类中增加一些自己特有的特征信息(属性、方法和类常量),没有扩展,继承也就没有任何的意义!
单继承:一个类只能继承自一个其他的类,不能继承多个类,单继承也是大多数面向对象的语言的特性(C++就是多继承)
29:重写overwrite
a:当子类成员和父类成员名字相同的时候,从父类继承下来的成员就会重新定义!起作用的是子类的成员
b:这个是由继承链条来决定的,先在子类中找,找到后就不再向父类中寻找了
c:可以通过修改名字区分,但是遇到魔术方法不可避免,如果父类也很重要需要执行,那就显示的调用父类的同名方法:父类名::父类方法名
30parent关键字
相对于self代表的当前所属类的类名,parent关键字代表的是其父类的名字!通常用于在子类中调用父类的成员的时候使用!也可代表父类的父类
31:访问控制修饰符
public:公共的,当前类内,继承链类内以及类外都是可以被访问到!
protected:受保护的,当前类内,继承链上类内可以被访问到!
private:私有的,只有当前类内可以被访问到!
当子类重写父类的成员的时候,子类的访问控制修饰符的作用范围不应该低于父类的作用范围!
父类:public 子类:只能是public
父类:protected 子类:可以是protected或public
私有成员不能被重写和调用,可以继承看成子类新的成员
32:final最终类
类有两个功能:实例化对象、被其他类所继承
产生了两个极端:
final类:也叫最终类,不能被继承,只能实例化对象的类!
abstract类:也叫作抽象类,不能实例化对象,只能被继承的类!
33:abstract抽象类
----不能实例化对象、只能被继承
----要么实现父类中所有的抽象方法,要么只能继续做抽象类!
为什么有抽象类,现实世界中很多类很抽象,范围大比如动物类,概念模糊比如魔鬼妖怪类。类分成的小雷又有相似的动作,实现动作的方式又不同。
多态就是不同的对象实现相同的动作的时候有多种形态(方法)!
抽象方法:在类中规定一些必须要完成的动作(方法),但是不去完善方法体(因为不同的对象实现这个动作的方式不一样)
抽象类的声明:abstract class Anima{}
34:接口
接口不是类,是一种规范,规定该接口的下级类必须要实现的公共的方法!
在一个接口当中,只能出现两种成员:
接口常量:其实就是普通的常量,只不过是出现在接口里面而已!
抽象方法:必须声明为public
接口的语法:interface I_animal{
const PI=3.14;
public function move();
}
35:接口的实现-----关键字implements
当一个类“实现”一个接口的时候,也只有两种选择:
1,实现该接口中所有的公共的抽象方法(完善方法体)
2,如果该类没有实现接口中的部分抽象方法或全部抽象方法,只能做抽象类,等待更下一级的类去实现!
36:接口与抽象类的比较
1,从逻辑上看,接口可以看成是抽象类的一个“子集”,接口比抽象类更“抽象”,都可以规定下级类的内部结构,只是接口中只能有公开的抽象方法和接口常量
2,接口不是类,而只是类的一种规范,类又是对象的一种规范,但是抽象类是类!
3,PHP不支持多继承,但是支持多实现,也就是说,一个类可以同时实现多个接口!这也是接口与抽象类的最本质的区别!注意:当一个类实现多个接口的时候,要么实现所有接口中的所有的抽象方法,要么就只能做抽象类!
37:overload重载
指的是对不可访问的成员的处理,称之为成员的重载!
不可访问有两种情况:
第一,该成员根本就不存在!
第二,该成员声明成了private或protected,没有权限访问!
38:属性重载
关于属性重载,根据对不可访问的属性的不同的操作,分别由以下的四个魔术方法来完成:
为不可访问的属性赋值的时候:__set()
获取不可访问的属性的时候:__get()
删除不可访问的属性的时候:__unset()
判断不可访问的属性是否存在的时候:__isset()
39:方法重载
处理不可访问的方法!
利用两个魔术方法来完成:
__call()
__callstatic()
__call()
一般来说,该方法有两种处理方式:
1,给出友好的提示,告知用户该方法不存在或不可访问!
2,执行默认的操作!
__callstatic()
当调用一个不可访问的静态方法,会自动的执行该访问,需要在方法的前面加上static
40:魔术方法和魔术常量
魔术方法:
__construct()
__destruct()
__clone()
__sleep()
__wakeup()
__set()
__get()
__unset()
__isset()
__call()
__callstatic()
另外
__invoke()
当把对象当成一个函数(或方法)来使用的时候,会自动的调用该魔术方法,目前使用的不是很多!
__toString()
触发条件:将对象当成是一个字符串来使用的时候,会自动的触发该魔术方法,该方法的返回值,一般就是对象转换为字符串的结果!
41:总结,学过哪些魔术常量:
__DIR__
__FILE__
__LINE__
__FUNCTION__
__CLASS__
代表当前的类名!
__METHOD__
代表当前的方法名!
41:当前
static:当前类,绑定(确定)类名的时机发生在代码的执行阶段
42:单例模式
实际应用中存在一些类,只需要实例化一个对象就可以完成所有的功能。
单例模式就是使得一个类只能开辟一个对象空间、节省对象资源
第一步:防止用户通过new关键字无限实例化对象
在new实例化对象的时候会调用构造方法,此处把构造方法私有化,类内已经无法实例化出对象了!
第二步:增加一个静态的公共方法,进入到类的内部
1:静态方法--》因为还没有实例化一个对象出来,只能用类来访问
2:公开的方法--》因为必须在类外调用这个方法
第三步:为当前类增加一个私有的静态属性
思考:
1,为什么是静态的?
因为此时还是必须通过类来访问该属性
2,为什么是私有的?
保证在类外无法修改该属性的值
第四步:私有化__clone()方法
43:工厂模式
设计一个类,帮助其他的类实例化对象,传递一个类名就可以得到相应的对象
public static function getOBJ($class_name){return new $class_name;}
如果用户想使用单例模式,就可以使用Factory工厂类得到对象,如果用户不想使用单例模式,就直接new就行了!灵活
44:遍历对象
在类外只能遍历出一个对象的公开的非静态属性!
45: 类和对象的相关函数
class_exists() 判断一个类是否存在!
interface_exists() 判断一个接口是否存在!
method_exists() 判断一个方法是否存在! 两个参数
get_class() 获得对象所属的类!
get_parent_class() 获得对象的父类!
get_class_methods() 获得一个类的所有的方法名,返回一个数组!需要一个参数是类名!
get_class_vars() 获得一个类的所有的属性
is_object() 判断一个变量是否是一个对象!
1:类是对一类事务的统称
定义类的三大成员:
定义属性(变量)
定义方法(函数)
定义类常量(常量)
2:类有属性和方法
3:对象是类中的一个个体
4:方法就是函数、属性就是变量
5:类的定义和使用
6:类的实例化的理解
对于类来说,使用之前要先实例化,如:
$类变量名 = new 类名(参数 1,参数2...);
类为什么要实例化,类是一个抽象的群体,只有实例化了才能得到一个具体的个体。类的实例化结果就是对象
配电脑,电脑配置清单就是类,用这个配置清单配置出来的机子就是对象
7:对象访问成员
$对象名->属性名
$stu->stu_name="z";
8:对象访问方法
$stu->payMoney();
9:判断一个对象是否属于是由某个类实例化而来
对象变量 instanceof 类名
10:为什么打印var_dump一个对象的时候只有属性被打印出来
实例化对象的属性都会单独在内存开辟一个新的内存空间,不同对象之间的属性由各自所属的对象进行管理,但是方法只有一份。
属性归对象管理
方法归类管理
属性不能在方法内直接方法,需要找到所属的对象才能访问,典型的做法是,在方法内使用$this代表当前被调用的那个对象
10:构造方法:通常实例化完一个对象后,都要对对象的属性进行初始化操作才有意义!为什么要初始化,不初始化就像一个人,没有属性没有方法。初始化就是赋值。
只有类,没有对象,没有具体的实体。所以要实例化来实例出具体的对象
只有对象,没有属性,也就没有本身自有的特征,需要对对象的属性进行初始化操作
第一种初始化:$stu1->stu_name='张三'; $stu2->stu_name='张三';
缺点:这样极不方便、代码冗余
第二种初始化:先然后创建能初始化对象属性的方法 public function init($n,$a,$m){$this->stu_name=$n;------}
缺点:每次实例化一个对象的时候都要手动调用init方法才能对对象进行初始化。我们想做到的是在实例化一个对象的时候自动的调用初始化属性的方法
$stu1->init('张三',21,1888);$stu2->init('李四',22,1888);
第三种方法:构造方法,实际上在我们实例化一个对象的时候系统自动的调用__construct()方法
//构造方法
public function __construct($n,$a,$m){
$this->stu_name='$n';
$this->stu_age='$a';
$this->stu_money='$m';
}
//实例化一个学生对象
$stu1=new student('张三',24,12000);
$stu2=new student('李四',21,15000);
11:析构方法,只为释放资源。
public function __destruct(){mysql_close($this->link);}
12:析构方法、构造方法统称为魔术方法
13:对象的传值(值传值和引用传值效果一样)
a:对象的值传递,对象的变量名不是直接引用改对象的内存地址空间,而是引用了对象内部的编号,值传递的时候,复制的其实是对象的内部编号
b:对象的引用传值,直接引用原对象的内部编号
当我们使用$stu2=$stu1,再重新赋值$stu2->stu_name='李四'的时候会改变原对象的属性值,因为操作的是同一个属性内存地址,
14:对象的克隆(对象的赋值无法创造新的对象,所以产生了克隆)
a:所谓的克隆,不是通过类的实例化得到一个新的对象,而是通过一个已有的对象得到一个新的对象!
b:新对象 = clone 已有的对象
c:克隆出的对象与原对象有相同的属性,但是占用不同的内存存储空间
d:克隆不会触发构造方法,克隆是根据原有的对象复制而来,构造方法是实例化一个新的对象的时候触发
e:怎么区分新旧对象
用__clone()
在克隆的时候会自动的调用该魔术方法,负责对新对象进行相关的初始化工作!
15:静态成员(静态属性、静态方法),所有的对象所共享的成员!而对象又是类来管理的,所以静态成员是由类来管理
16:静态属性
a:定义语法:public|protected|private static属性名
b:访问语法:类::静态属性名
注意:这里的静态属性名要加上$符号,比如Student::$stu_age,主要是和以后的类常量相区分!
c:无法使用一个静态对象直接访问静态属性,因为不单独属于某个对象
d:使用类访问静态属性,使用对象访问非静态方法!在类的内部用self::静态属性,仅仅在类的内部
17:静态方法,所有对象共享的方法
a:定义语法 public|protected|private static function f2(){}
18:静态方法和非静态方法,在内存中都只有一份,无非一个共享一个独有。但是非静态方法可以用$this.类调用静态成员,对象调用非静态成员
19:类常量 属于某一个类
a:语法定义 :const CLASS_ID='618';不能加访问控制修饰符,也不受访问控制的限制
b:访问语法 :类名::常量名
c:当前类的内部访问类常量可以用类名也可以用self
现在总结下类中的成员:
静态属性、类常量 类空间(为类所有)
非静态属性 对象空间
静态方法、非静态方法 用户代码区
20:类文件的自动加载
a:需要引入一个文件的时候,include引入,该类文件的命名方式为:类名.class.php。
b:多个文件引入,将多个文件先引入到一个文件,再引入这个文件。问题是会引入不必要的类,我们要自动、按需加载引入
c:自动加载的主要的规则就是:类名和类的定义文件一定要有关联,也就是说,我们要保证能够通过类名找到类所在的类文件才行!
21:自动加载机制
PHP在执行的时候,如果发现需要一个类(只要是和这个类相关的任何的操作),而当前脚本又没有该类的定义代码也没有载入该类的类文件,那么PHP系统会自动的调用一个名字叫作__autoload()的一个函数!调用的时候,会给该函数传递一个参数,该参数就是为当前需要的类的类名!
22:注册其他的自动加载函数
情况:加载的文件里又有一个自动加载函数
处理措施:
第一步:定义一个可以加载类文件的普通函数
第二步:将该普通的函数注册成自动加载函数 spl_autoload_register(‘函数名’);
函数的注册一定要发生在需要某个类之前!
可以注册多个自动加载函数,在载入成功之前,会依次的按注册的顺序执行,直到找到为止!一旦找到所需的类文件,就不再继续执行其他的注册了的自动加载函数了!
一旦注册了其他的自动加载函数,那么系统默认的__autoload()函数就失效了!如果想继续使用,必须像注册其他普通函数一样,重新的进行注册!
23:注册非静态方法
a:实例化一个对象出来
b:spl_autoload_register函数的参数为一个索引数组,该数组里面只有两个元素,第一个元素为一个对象变量,第二个元素为方法名!
24:注册静态方法
spl_autoload_register函数的参数为一个索引数组,该数组里面只有两个元素,第一个元素为一个类名,第二个元素为方法名!
25:数据的序列化与反序列化
写进去的数据,读出来会转换,写进false,显示0读出空字符串
序列化--serialize($data):将原始数据转换为用于保存和传输的字符串数据(不仅仅记录原数据的值,还记录原数据的类型等相关信息)
反序列化--unserialize($data):将序列化之后的字符串数据,根据其记录的值和类型等相关信息,转换为原始数据!
26:__sleep()
序列化一个对象的时候由系统自动调用,用于规定哪些属性应该被序列化,返回一个索引数组,数组内的元素为需要被序列化的属性名的集合!
27:__wakeup()
在反序列化一个对象的时候自动触发!
作用:就是在反序列化一个对象的时候,对该对象进行一系列的初始化操作!
28:类的继承
继承:体现出类与类之间的共性与个性的关系,一个类从另一个已有的类获得其成员和特性,就是继承!
a:子类实例化出来的对象也同时是其父类的一个实例
b:父类的属性和方法都可以被继承
几个概念
继承:一个类从另一个已有的类获得其成员和特性,就是继承!
派生:从一个已有的类产生一个新的类,叫作派生!
注意:继承和派生其实是从不同的方向来描述的一个概念,本质上是一样的!
父类:也叫作基类,就是指以后的那个被继承的类
子类:也叫作派生类或扩展类
扩展:在子类中增加一些自己特有的特征信息(属性、方法和类常量),没有扩展,继承也就没有任何的意义!
单继承:一个类只能继承自一个其他的类,不能继承多个类,单继承也是大多数面向对象的语言的特性(C++就是多继承)
29:重写overwrite
a:当子类成员和父类成员名字相同的时候,从父类继承下来的成员就会重新定义!起作用的是子类的成员
b:这个是由继承链条来决定的,先在子类中找,找到后就不再向父类中寻找了
c:可以通过修改名字区分,但是遇到魔术方法不可避免,如果父类也很重要需要执行,那就显示的调用父类的同名方法:父类名::父类方法名
30parent关键字
相对于self代表的当前所属类的类名,parent关键字代表的是其父类的名字!通常用于在子类中调用父类的成员的时候使用!也可代表父类的父类
31:访问控制修饰符
public:公共的,当前类内,继承链类内以及类外都是可以被访问到!
protected:受保护的,当前类内,继承链上类内可以被访问到!
private:私有的,只有当前类内可以被访问到!
当子类重写父类的成员的时候,子类的访问控制修饰符的作用范围不应该低于父类的作用范围!
父类:public 子类:只能是public
父类:protected 子类:可以是protected或public
私有成员不能被重写和调用,可以继承看成子类新的成员
32:final最终类
类有两个功能:实例化对象、被其他类所继承
产生了两个极端:
final类:也叫最终类,不能被继承,只能实例化对象的类!
abstract类:也叫作抽象类,不能实例化对象,只能被继承的类!
33:abstract抽象类
----不能实例化对象、只能被继承
----要么实现父类中所有的抽象方法,要么只能继续做抽象类!
为什么有抽象类,现实世界中很多类很抽象,范围大比如动物类,概念模糊比如魔鬼妖怪类。类分成的小雷又有相似的动作,实现动作的方式又不同。
多态就是不同的对象实现相同的动作的时候有多种形态(方法)!
抽象方法:在类中规定一些必须要完成的动作(方法),但是不去完善方法体(因为不同的对象实现这个动作的方式不一样)
抽象类的声明:abstract class Anima{}
34:接口
接口不是类,是一种规范,规定该接口的下级类必须要实现的公共的方法!
在一个接口当中,只能出现两种成员:
接口常量:其实就是普通的常量,只不过是出现在接口里面而已!
抽象方法:必须声明为public
接口的语法:interface I_animal{
const PI=3.14;
public function move();
}
35:接口的实现-----关键字implements
当一个类“实现”一个接口的时候,也只有两种选择:
1,实现该接口中所有的公共的抽象方法(完善方法体)
2,如果该类没有实现接口中的部分抽象方法或全部抽象方法,只能做抽象类,等待更下一级的类去实现!
36:接口与抽象类的比较
1,从逻辑上看,接口可以看成是抽象类的一个“子集”,接口比抽象类更“抽象”,都可以规定下级类的内部结构,只是接口中只能有公开的抽象方法和接口常量
2,接口不是类,而只是类的一种规范,类又是对象的一种规范,但是抽象类是类!
3,PHP不支持多继承,但是支持多实现,也就是说,一个类可以同时实现多个接口!这也是接口与抽象类的最本质的区别!注意:当一个类实现多个接口的时候,要么实现所有接口中的所有的抽象方法,要么就只能做抽象类!
37:overload重载
指的是对不可访问的成员的处理,称之为成员的重载!
不可访问有两种情况:
第一,该成员根本就不存在!
第二,该成员声明成了private或protected,没有权限访问!
38:属性重载
关于属性重载,根据对不可访问的属性的不同的操作,分别由以下的四个魔术方法来完成:
为不可访问的属性赋值的时候:__set()
获取不可访问的属性的时候:__get()
删除不可访问的属性的时候:__unset()
判断不可访问的属性是否存在的时候:__isset()
39:方法重载
处理不可访问的方法!
利用两个魔术方法来完成:
__call()
__callstatic()
__call()
一般来说,该方法有两种处理方式:
1,给出友好的提示,告知用户该方法不存在或不可访问!
2,执行默认的操作!
__callstatic()
当调用一个不可访问的静态方法,会自动的执行该访问,需要在方法的前面加上static
40:魔术方法和魔术常量
魔术方法:
__construct()
__destruct()
__clone()
__sleep()
__wakeup()
__set()
__get()
__unset()
__isset()
__call()
__callstatic()
另外
__invoke()
当把对象当成一个函数(或方法)来使用的时候,会自动的调用该魔术方法,目前使用的不是很多!
__toString()
触发条件:将对象当成是一个字符串来使用的时候,会自动的触发该魔术方法,该方法的返回值,一般就是对象转换为字符串的结果!
41:总结,学过哪些魔术常量:
__DIR__
__FILE__
__LINE__
__FUNCTION__
__CLASS__
代表当前的类名!
__METHOD__
代表当前的方法名!
41:当前
static:当前类,绑定(确定)类名的时机发生在代码的执行阶段
42:单例模式
实际应用中存在一些类,只需要实例化一个对象就可以完成所有的功能。
单例模式就是使得一个类只能开辟一个对象空间、节省对象资源
第一步:防止用户通过new关键字无限实例化对象
在new实例化对象的时候会调用构造方法,此处把构造方法私有化,类内已经无法实例化出对象了!
第二步:增加一个静态的公共方法,进入到类的内部
1:静态方法--》因为还没有实例化一个对象出来,只能用类来访问
2:公开的方法--》因为必须在类外调用这个方法
第三步:为当前类增加一个私有的静态属性
思考:
1,为什么是静态的?
因为此时还是必须通过类来访问该属性
2,为什么是私有的?
保证在类外无法修改该属性的值
第四步:私有化__clone()方法
43:工厂模式
设计一个类,帮助其他的类实例化对象,传递一个类名就可以得到相应的对象
public static function getOBJ($class_name){return new $class_name;}
如果用户想使用单例模式,就可以使用Factory工厂类得到对象,如果用户不想使用单例模式,就直接new就行了!灵活
44:遍历对象
在类外只能遍历出一个对象的公开的非静态属性!
45: 类和对象的相关函数
class_exists() 判断一个类是否存在!
interface_exists() 判断一个接口是否存在!
method_exists() 判断一个方法是否存在! 两个参数
get_class() 获得对象所属的类!
get_parent_class() 获得对象的父类!
get_class_methods() 获得一个类的所有的方法名,返回一个数组!需要一个参数是类名!
get_class_vars() 获得一个类的所有的属性
is_object() 判断一个变量是否是一个对象!