PHP类类的使用的详细总结
1:结构和调用(实例化):类的类名{ },电话:$ obj =新的类名();当一个类有一个构造函数,参数也应通过。比如$ obj =新的类名($ V $ V2…);
二:构造函数和析构函数:
1。构造函数用于初始化:使用__construct(),参数。
2。但析构函数不能带参数(用于销去上课之前执行一些操作或功能),析构函数被__destruct()。在脚本执行结束时,内存中的对象将被卖掉了,所以你不需要分析生成功能,但一些这样的Cookie应该卖完了这个功能。
知识点:在PHP4中还提供了一个构造函数,但使用的方法具有相同名字的类,还可以用这种方法可以兼容的,当一个类不包含__construct,搜索方法,具有相同名字的类,如果找到了,那就是构造函数,如下:
复制代码代码如下所示:
类测试
{ var;
函数测试(){ $ = B = 5;}
功能ADDAB($ C){ return美元-> B + C美元;}
}
美元=新(测试);echo $ -> ADDAB(4); / /返回9
3,PHP不会自动调用父类的构造函数(不支持构造函数重载),并且必须用父关键字显式调用。
复制代码代码如下所示:
员工类{
功能__construct()的…
}
类管理器范围雇员{
功能__construct(){
家长::_construct();
调用这个子类的父类构造函数!;
}
}
当然,你也可以叫,没有任何的实例的其他类的构造函数,只加类名前__construct(等):
otherclassname::__construct();
类的主要家庭成员:属性、方法、常量、静态成员
三。类的属性:
有两种方法分配或赋值类的属性。
1、使用公共领域的公钥词。
2、使用__set()和()__get分配和价值分别。前者称为设置方法(setter)或改性方法(mutator),后者称为存取方法(accessor)或采集方法(吸气),建议使用这种方法:优点:
一、数据验证可以在__set进行()。
B,易于统一管理属性。
小心 uff1a
第一:__set()和()__get只对私人财产的行为,定义为公共财产,两人会回应,如下:
复制代码代码如下所示:
类测试{
受保护的$ = 9,$ = 2,美元;
公共单位D;
功能__set($,$ V){ $这-> $ N = $ V 2;}
功能__get($name){ return美元-> $name + 2;}
}
$ =新测试();
$ A = B = 5;回声;回声$ A - B;
美元,美元,美元和C B的实例,将过滤和__set和__get回来,它不会排放美元例子,美元-> D = 5,返回5。
第二:__set($,$ V)有两个参数,__get(N)只能有一个实例uff1a参数。
复制代码代码如下所示:
类测试{
私人$ = 5,$ = 6,C;
功能__set($,$ V)
{
如果(N = =$ N>0)
$ $;
其他的
$ $ > $ = $ v + 2;
}
功能__get($name)
{
返回这个-> $name; / /如果改回+美元-> ADDAB(美元-> $name);如调用的值,实际收益是一个+ +的默认值是5 + 5 + 6 = 16。
}
AddAB()函数
{返回$这一点;
}
$ =新测试();
$ = a = 11;说明:写类$ $ n内部变量方法,但外部实例使用$ > >方式。
$ = 12;14
$ = K = 22;
自由膨胀的性质,在K的例子,无论是否使用__set,当实例的设置,你可以使用$ E -> newproperty = XX;创建一个属性,但不建议。
四。课堂教学法:
理解课堂上的功能。
呼叫:
1、内部电话:可以使用美元->粉丝名();或美元-> ADDAB()或测试::AddAB();
2。当实例化调用,使用$ E -> ADDAB();$这个关键词是不使用这种方法,如在上面的例子中:
函数的AddAB(){ return美元-> +美元-> b;}
改为:函数AddAB(){ return 25;},也可以称之为::AddAB();或测试::AddAB()在一个外部的实例;
五。班级的常数:
如果一个类的属性被理解为一个类中的变量,那么类的常量与变量不同,它的定义是:
复制代码代码如下所示:
类测试{
私人美元;
常量=3.14;
的…
在类pi或类名称中使用上面的调用:常量$::::pi,如下所示:pi,测试:
功能getValue(){
还可以使用这个关键字或类名,但是应该使用双冒号。
}
}
$ =新测试();
$ = PI = 5; /注,这里是- >创建一个名为pi的属性,而不是pi常数的值的变化。
常量:这个常量的调用。
常数只能用于双冒号:调用,不能更改其值。
在一个类的外部实例化之后,还有两种调用类常量的方法:
$::pi或测试::pi,通用点是使用冒号,不同的点是外部不能使用此关键字,只使用实例名,但类名::pi是通用的。
六。类的静态成员(静态或静态方法):
如果需要创建一个所有类的实例共享的字段或方法,则必须使用静态成员:
1,静止的党员是共产党员。它调用脚本上类的所有实例,但不能由类的特定实例名调用它。相反,它调用类名的方式:成员名。
2。当每一个新的实例被创建,静态成员开始重新从实例上创造的价值最后的时间,而不是在类的初始值。
三.对于使用公共定义的静态成员,可以在外部更改。
复制代码代码如下所示:
类测试{
公共静态$ = 0;
功能__construct(){自::$ V + +;}
静态函数(){ return GETV自::$ V;}
}
$ =新测试();
回声(测试::GETV); / /返回1
$ =新测试();
回声(测试::GETV); / /返回2
测试::$ = 8;作为公共定义的成员,更改静态成员的值。
$ =新测试();
回声(测试::GETV); / /返回9
七。关键词:
(1)这个关键字:内部引用类本身被用于类。访问属性或方法或常量,如$ - <属性名或方法名。$::常量名称。这也可以用于类的子类中,引用它自己的属性或方法。
(二)双冒号:关键字:用于调用常量、静态成员。
(三)自关键词:调用静态成员在类和双冒号,如自我::$静止无功,并且不使用美元,这叫静态成员在类。
(四)__tostring():使用__tostring()中的一类将类转换为一个字符串并打印类很少使用:例如:
复制代码代码如下所示:
类测试{公共$ P;
公共功能__tostring(){ return var_export($,true);}
}
$ =新测试();
回声$ / /;输出:测试::__set_state(array(P= >空)),或回声(美元-> __tostring);
(五)__clone():这个关键词时发生的对象是克隆的,是用来改变某些值时,克隆是克隆。
(六)__call():方法重载,看看下面的例子:
复制代码代码如下所示:
CB级{
功能__call($法$ N){
如果($方法= = 'showvartype){
如果(is_numeric($ N { 0 })){ / /不n.use美元$ N { 0 };
美元-> displaynum();
} else if(is_array($ N { 0 })){
美元-> displayarr();
其他{ }
美元-> displayother();
}
}
}
功能displaynum(){
这是数字!;
}
功能displayarr(){
这是一个数组!;
}
功能displayother(){
回声不是数组或数字!
}
}
为x = a;
Y元=数组(a,b);
$ =新CB;
$ B -> showvartype(X元); / /不是数组不是数字
$ B -> showvartype(Y元); / /这是一个数组
请注意,showvartype()方法不能在类定义的代码,否则不能使用。
(七)扩展:继承:类A,如类{ }类B扩展一个{ B,继承类A
附:内存:在使用常量常量调用一个方法或属性后,被称为双冒号:不晕。
八、方法和属性的范围:
共有6种类型:公共(默认情况下,可以省略,相当于php6 var声明,私人(民营),也不受保护的使用(私人),但是,通过使用抽象(抽象),人参,下同),最终(停止在子类中覆盖也称重站继承,是用来修改类名和方法,如最终类测试{最终功能(好玩){ } },而不是财产),静态(静态)
九:抽象类和抽象方法(抽象:注释:没有抽象属性):
摘要这是父类定义一个模板或基类的一个子类可以理解。范围摘要仅是父类中声明,而在类中实现。注意事项 uff1a
1。抽象类不能实例化,只能在子类(特定类)继承后继承。
2,抽象类必须在其子类中实现抽象类的所有抽象方法,否则会出错。
3、在抽象的方法,只有声明,但没有具体的实现:如抽象函数gettow(返回){ $这-> P };这个语句是错误的,唯一的功能(gettow):摘要(用方括号{ };不显示),在复杂的主要的类层次抽象方法和抽象类。这个层次需要确保每个子类包含和超载的特定方法。这也可以通过接口实现
4,属性不能被命名为抽象属性,如抽象$ = 5是错误的。
5。只有被声明为抽象的类才能声明抽象方法,但是如果方法声明是抽象的,则不能实现:
复制代码代码如下所示:
抽象类员工
{
抽象函数A(…);
抽象函数B(…);
}
在未来,父类的扩展,形成多种亚型(如管理者、员工、收银员)。
6,在抽象类中,如果要实现一个特定的方法,它不能被声明为抽象的,这可能更有意义。几个类库的公共部分可以被提取到抽象类中,而其他类则继承抽象类:
复制代码代码如下所示:
抽象类baseshop {
常量税= 0.06;在抽象类中定义常量
公共功能购买($ GID){ / /如果定义为抽象函数(买)抽象方法不能实现主体在这里。
回声(你买了ID为:美元。GID。的物品);
}
公共功能卖($ GID){
回声(你卖ID为:美元。GID。的物品);
}
公共功能视图($ GID){
回声(你看身份证:美元。GID。的物品);
}
}
类ballshop延伸baseshop {
VaR itme_id美元= null;
公共功能__construct()
{
美元-> itme_id = 2314;
}
公共功能开放()
{
美元(美元->销售-> itme_id);
}
公共功能gettax()
{
回声printf(平均税率是%1。',美元::税×100);
}
}
$ S =新ballshop;
美元开(ID);您出售货物:2314
美元店-> gettax();
十:类型提示:
注意,类型提示只能用于参数为对象,但不能用于整数,字符串,浮点类型和其他类型。有些类方法需要传入的参数是所需的对象类型,并且可以通过以下方法来执行这个方案。实现型提示的方法对象类型参数添加一个现有的类的名称,如功能funname(otherclassname otherclassinsname美元美元,等等)。注意,otherclassname必须存在的类,如下:
复制代码代码如下所示:
类$ 56;}
类测试{
__construct()函数
{ echo $这-> ADDAB(新的EM(),2)};}
功能ADDAB(EM J,$c) / /这个方法,可以在内部调用,也可以调用外部。只要范围许可证。
{返回
}
$ =新测试();
新的EM();
回声美元-> ADDAB($,2); / /或美元-> ADDAB(新)、EM(2);
十一。班级管理:
1、instanceof关键字:分析一个对象是否是一个类或其子类的一个实例或实现特定的接口:作为一个例子,但应该指出的是,没有其他报价:类名的分隔符,否则会出错。例如,测试不能use'test
复制代码代码如下所示:
类test2 { }
类测试{ }
类testchilern延伸试验{ }
美元=新test2();
新测试();
我=($m instanceof测试);
如果($一)回声M $是一个类测试的实例!;获取这个值
开关($ instanceof测试){
情况真的:
回声是;
打破;
案例假:
返回否;获取这个值
打破;
}
美元D =新testchilern();
如果($ instanceof测试)回波美元D是类测试类!;获取这个值
2、确定类的存在:布尔class_exists(字符串class_name):class_exists(测试);
3、返回类的名称:字符串get_class(对象),返回该实例的类的名字时,它是成功的,和失败返回false:
美元=新(个);回声get_class(合一); / /回归测试2
4、了解该类共同属性:数组get_class_vars('classname),返回键排列:包含所有已定义的公共属性名称和对应的值。这个函数不使用实例名称作为变量
5、收益法:get_class_methods(测试); / /或get_class_methods(合一);提供实例名称参数,返回所有的非私有方法,包括构造函数。
6、print_r(get_declared_classes())了解所有类的名称在当前的PHP版本有149个PHP5。
7、get_object_vars(合一)返回的实例中所有常见的属性及其值的数组。注意它,get_class_vars之间的差异():
*(1)get_object_vars(合一)是一个参数的例子,和get_class_vars(测试)是一个参数使用类名。
*(2)通过get_object_vars属性值(美元)的实例运行后的值,且属性值通过get_class_vars(测试)是班上的初始定义。
*(3)都返回数组,返回的指定属性的值为空值,如在公共$ Q的定义测试;返回数组({五} = 5 {重置} = >),
* /
8,返回父类的名称:get_parent_class($); / / get_parent_class(或试验);回归测试
9、确定界面存在:布尔interface_exists($字符串接口{体},布尔)
10、确定对象的类型:布尔is_a($ obj,'classname)。当$ obj属于类名的类,或属于它的子类,它返回TRUE,如果美元不是类类型的对象,则返回false。如:is_a($,测试)
11,确定它是否是一个的子对象类:当美元的B是从测试类继承,返回真,否则为假。布尔is_subclass_of($,测试);
12。确定是否有一个类或一个instance.method_exists方法($,'getv)或method_exists( / /测试,'getv),这种方法的适用范围适用于非公共函数的定义。
上面的函数示例:
复制代码代码如下所示:
类测试{
公共$ 2;
私有$ 5;
功能__construct(){
此$ = v = 5;
}
私有函数GETV(){
返回$;
}
}
类test2延伸试验{ }
$ =新测试();
$ =新test2();
print_r(get_class_methods(测试)); / /:print_r(get_class_methods($));返回({ 0 }:阵列= > __construct { 1 } = > GETV)
回声';
print_r(get_class_vars(测试); / /返回):({ } = 2 V阵列),和上面不一样,与print_r(get_class_methods($));
回声';
回声get_parent_class($); / / get_parent_class(或试验);回归测试
回声';
回声is_a($,测试'); / /返回1
回声';
如果(is_subclass_of('test2 '测试'))回波是一个子类!; / /或(is_subclass_of($,测试)),返回1,当1美元返回false参数,
回声';
回声method_exists($,'getv)或method_exists( / /测试,'getv)返回1,用于私人领域的方法,此功能也适用于。
十一。自动加载类库文件:
当有许多类,如文件加载3类库文件:a.class.php,b.class.php,c.class.php,我们需要使用三require_once(类/类。PHP)。
require_once('classes / b.class。php);
require_once('classes / c.class。php);
它可以通过自动加载功能的PHP5的处理:在全球应用程序配置文件中,我们定义了一个特殊的功能__autoload(合班)功能(__autoload不是一个类的方法,它是一个独立的功能,与课堂无关)。
功能__autoload(合班){
require_once(类/美元类)
}
不管你的功能是把,你不必调用autoload函数创建一个类instance.php时会自动完成。但我们必须注意,该类用于在调用页创建实例的名称,这称为文件的名称,并在文件的类的名称必须是相同的3。这不需要打电话给__autoload();如果它是不同的,你必须调用__autoload(C)分开;并给它一个文件名前缀,如:
为c.class.php文件代码:
复制代码代码如下所示:
< PHP
C类{
公共$ M = 7;
}
>
这里的代码的类名是C,文件名也是C,
现在你想打电话给在index.php:
复制代码代码如下所示:
< PHP
功能__autoload(合班){
require_once class.class.php美元;
}
$ =新(c);创建C类的实例调用
回声$ M - M;
>
在这一点上PHP自动呼叫在根目录下的c.class.php C类。
但如果在c.class.php代码:
复制代码代码如下所示:
< PHP
类毫米{
公共$ M = 7;
}
>
和调用页面index.php代码:
复制代码代码如下所示:
< PHP
功能__autoload(合班){
require_once class.class.php美元;
}
# __autoload(C'); / /如果没有这条线会出错。
m =新的mm();
回声$ M - M;
>
会有一个错误,和mm.class.php文件无法找到。在这一点上,你可以添加一行__autoload(C);但这不会达到简化代码的目的。
类的类扩展:类高级函数:
1。对象的克隆:
克隆对象的实例时,其属性的初始值继承了克隆对象的当前值。
复制代码代码如下所示:
类测试
{
公共$ P = 5;
功能(__clone){ / /只发生在克隆工作。用于克隆的时间改变一些价值观
$ > p = 15;
}
}
$ =新测试();
回声$ A - P;
美元-> P = 8; / /如果没有__clone($)方法,P值为8
美元=克隆美元;
$ 15;
两。对象继承:
未声明为最终的类可以继承,最终和私有定义的方法也可以继承。私有未定义的属性也可以继承。当一个类继承父类或超类时,您可以直接使用父类或超级类(祖父和祖父的祖父)属性方法。
关键:理解构造函数的特性和继承中的重载!
(1)继承中构造函数的特性:
1。当父母有一个构造函数,子类不:子类将自动执行父类的构造函数时被实例化。如果你想创建一个子类的实例,你需要将父类中的构造函数的参数要求,否则一个错误。即使子类子类的呢没有一个构造函数,需要输入所需的父类的父类的构造函数实例时created.php将搜索内置在构造函数从实例中的子类的参数,一旦发现并使用构造函数阻止它。它不搜索了,所以如果子类本身没有构造函数,子类是基于一个最近的父类的构造函数。
复制代码代码如下所示:
类钙{
公开姓名,年龄;
功能__construct(N){
$ >;
这个年龄= 25;
}
功能__set($,$ V){
$ $;
}
功能__get(N){
返回$;
}
}
CB类扩展ca
功能funb1(){ echo的CB级执行成功!;}
}
类cc扩展CB {
func1函数(){ echo的CC级func1!;}
}
$ =新的断路器(杰克);
$ B ->名称=约翰;
$;
$ B -> funb1();
$c =新(CC); / /这里会出错,因为CB不到构造函数,以钙为标准,需要一个参数,改变为C =新的CC('david);你可以。
$>名称();戴维
2,当类有一个构造函数时:此时,父类构造函数是否将拥有子类构造函数。
以上:
复制代码代码如下所示:
CB类扩展ca
功能__construct(){
回声这是CB级的__construct!;
}
功能funb1(){
回声'类CB执行成功!;
}
}
现在,当CB级有自己的构造函数,它创建一个实例为B =新的断路器(杰克),和参数杰克不工作,因为父类构造函数的CA不执行。所以$ B ->名称->美元时代没有初始化的值。你需要另一项任务$ ->名称=杰克,B ->年龄= 25美元;
如果您希望此时执行父类CA的构造函数,您可以这样做:
复制代码代码如下所示:
功能__construct(N){
家长::__construct(N); / /:::__construct CA(N);
回声这是CB级的__construct!;
}
母::__construct(N);只搜索父类的构造函数,发现停止查找当前构造函数,所以在上面的例子中,如果家长::__construct(N)用于CC级的最后一层,和CB级,CA有一个构造函数,然后CC的例子只会执行CB constructor.ca不执行。在这一点上,如果CC的情况下要调用构造函数CA和CB,有两种方法:
一、以及家长:CB:__construct(N)
在cc中,将构造函数更改为:
复制代码代码如下所示:
功能__construct(N){
钙:__construct(N); / /:班级名称:构造函数。
答::__construct();
回声这是CB级的__construct!;
}
(二)父类的属性或方法在子类中被调用:
1,调用父类方法:调用子类中父类的方法,有3种方法:
美元-> parentfunction();或
父类名称::parentfunction();或
家长::parentfun();
2。调用父类的属性:只有美元-> parentproperty;
(三)重装:
在子类中,可以定义与父类相同的属性或方法,更改父属性或方法的值或操作,并称之为重载:
类parclass {函数(){ } } pfun的…
Class ChildrenClass extends ParClass{function pfun () {....}}} / overloading of the parent class method pfun.
在子类重载之后,重载之后新定义的方法或属性在前面。
你也可以使用家长::parentfun()在子类;调用父类的方法,但是你得到的价值是子类本身的参数操作价值。它不是父类中的方法的价值。
三。接口:
接口:接口可以理解为一组通用的函数规范。最大的意义可能是在多人合作时为他们自己的发展提供一个通用的方法名称。
与抽象类中的抽象方法相同:
1,在接口中定义方法的具体实现是不可能的,它是由具体的类实现的。抽象类中的抽象方法不能被重新定义。只有抽象的方法和接口需要在特定的类中实现。
2。像抽象类一样,常量可以在接口中定义并由特定的类直接继承。
3,一个具体类必须实现抽象类的所有抽象方法(除了抽象方法)。类似地,如果某个特定的类在实现后实现接口,那么接口中的所有方法都必须完成。
接口实现过程:1、定义接口、2、使用..实现x、y、……与特定类的对接。
复制代码代码如下所示:
接口信息定义接口
常量= 22;
公共职能getAge();
公共职能getName();
}
类年龄信息 / /如果实现类年龄多个接口(扩展emjob)实现了信息互…
{
公共$年龄= 15;
公共$name = 'join;
功能getAge(){
回声等级是这个年龄;
}
功能getName(){
回声的名称是;
}
功能带(){
接口值定义的n常量:$::;直接继承接口在一个常量值中。
}
}
年龄=新时代;
直接调用接口中的常量值:$ 22。
年龄>因美元();
关于抽象类和接口类的使用:何时使用接口和何时使用抽象
1,关联性:当创建的模型被一些密切相关的对象采用时,它被抽象出来,使用无关对象的功能,使用接口。
2,多重继承:PHP类可以继承多个接口,但不能扩展多个抽象类。
3,公共行为的实现:抽象类可以实现其中常用的方法,但界面不好。
四、命名空间(php6)
在a.inc.php类库脚本和脚本的B.inc.php,一个类的名称是阶级的CNAME,和这两个文件需要在同一个文件中调用,如index.php.the命名空间是用在这个时候。
一步一步地:
1、打开A和B两个文件的顶部,分别在每个顶端加一行:
命名空间的空间;和命名空间spaceb;名称自定义。
2。当类被实例化的index.php,命名空间和双冒号前面都在教室的前面。
包括a.inc.php;
包括b.inc.php;
美元=新空间::CNAME();
$ =新spaceb CNAME(::);
这不会冲突。
但php6正式发布之前,功能仍不稳定。
五。实现迭代器和迭代。
PHP圣经P142;
六。使用反射(反射)API。
简单的例子:
类{…}。
$c =新的ReflectionClass(A; / / PHP的内置类。
回声;
的输出类A.php圣经P145的结构和内容;