常用关键字final、static、const、instanceof

2025-11-22 03:33:43

1、Final关键字的应用

在PHP5中新增了final关键字,它可以加在类或类中方法前。但不能使用final标识成员属性,虽然final有常量的意思,但是在PHP中定义常量是使用define()函数来完成的。在类中将成员属性声明为常量也有专门的方式,final关键字作用如下.

使用final标识的类,不能被继承

  在类中使用final标识的成员方法,在子类中不能被覆盖。

下面例子声明一个MyClass类并使用final关键字标识,MyClass类就是最终的版本。不能有子类,也就不能对它进行扩展。

<?php

       Final class MyClass{  //声明一个类,并使用final关键字标识,使其不能有子类

   //成员略

}

Class MyClass2 extends MyClass{//声明另一个类试图去继承final标识的类,结果出错

//成员略

}

运行结果为:

Fatal error:Class MyClass2 may not inherit from final class(My Class)  //输出错误

上例中,试图使用MyClass2类去继承用final标识的类MyClass时,系统报错。如果在类中的成员方法前加final关键字标识,则在子类中不能覆盖它,被final标识的方法也是最终版本。

<?php

   //声明一个类MyClass作为父类,在类中声明一个成员方法

     Class MyClass{

   //声明一个成员方法并使用final标识,则不能再子类中覆盖

     Final function fun(){

     //方法体中的内容略

}

}

//声明继承MyClass类的子类,在类中声明一个方法去覆盖父类中的方法

Class MyClass2 extends MyClass{

     //在子类中试图去覆盖父类中已被final标识的方法,结果出错

   Function fun(){

   //方法体中的内容

}

}

该程序运行结果为:

Fatal error:Cannot override final method MyClass::fun()   //系统报错

上面代码中声明一个MyClass类,并在类中声明一个成员方法fun(),在fun()方法前面使用final关键字标识。又声明一个MyClass2类去继承MyClass类,并在子类MyClass2中声明一个方法fun()试图去覆盖父类中已被final标识的fun()方法时,系统会出现报错信息


2、Static关键字的使用

 使用static关键字可以将类中的成员标识为静态的,既可以用来标识成员属性,也可以用来标识成员方法。普通成语昂作为对象属性存在,已Person类为例,如果在Person类中有一个”$country=’china’”的成员属性,任何一个Person类的对象都会拥有自己的一份$country属性,对象之间不会干扰。而static成员是作为整个类的属性存在,如果将$country属性使用static关键字标识,则不管通过Person类创建多少个对象,这个static成员总是唯一存在的,在多个对象之间共享的。因为使用static标识的成员是属于类的,所以与对象实例和其他的类无关。类的静态属性非常类似于函数的全局变量。类中的静态成员是不需要对象而使用雷鸣来直接访问的,格式如下:

类名::静态成员属性名;   //在类的外部和成员方法中都可以使用这种方式访问静态成员属性

类名::静态成员方法名();  //在类的外部和成员方法中都可以使用这种方式访问静态成员方法

在类中声明的成员方法中,也可以使用关键字”self”来访问其他静态成员。因为静态成员是属于类的,而不属于任何对象,所以你不能用$this来引用它,而在PHP中给我们提供的self关键字,就是在类的成员方法中用来代表本类的关键字.格式如下:

Self::静态成员属性名;     //在类的成员方法中使用这种方式访问奔雷中的静态成员属性

Self::静态成员方法名();   //在类的成员方法中使用这种方式访问本类中的静态成员方法

如果在类的外部访问类中的静态成员,可以使用对象引用和使用类名访问,但通常选择使用类名来访问。如果在类内部的成员方法中访问其他的静态成员,通常使用self的形式去访问,最好不要直接使用类名称。在线面的例子中声明一个MyClass类,为了让类中的count属性可以在每个对象中共享,将其声明为static成员,用来统计通过MyClass类一共创建了多少对象。

<?php

  //声明一个MyClass类,用来演示如何使用静态成员

  Class MyClass{

     Static $count;   //在类中声明一个静态成员属性count,用来统计对象被创建的次数

   

    Function __construct(){        //每次创建一个对象就会自动调用一次这个构造方法

     Self::$count++;             //使用self访问静态成员count,使其自增1;

}

 Static function getCount(){     //声明一个静态方法,在类外面直接使用类名就可以调用

   Return self::$count;          //在方法中使用self访问静态成员并返回

}

}

MyClass::$count = 0       //在类外面使用类名访问类中的静态成员,为其初始化赋值0

$myc1 = new MyClass();     //通过MyClass类创建第一个对象,在构造方法中将count累加1

$myc2 = new MyClass();     //通过MyClass类创建第一个对象,在构造方法中又为count累加1

$myc3= new MyClass();     //通过MyClass类创建第一个对象,在构造方法中再次为count累加1

Echo MyClass::getCount();  //在类外面使用类名访问类中的静态成员方法,获取静态属性的值3

Echo $myc3->getCount();   //通过对象也可以访问类中的静态成员方法,获取静态属性的值3

上例的MyClass类中,在构造方法内部和成员方法getCount()的内部,都使用self访问本累中使用static标识为静态的属性count,并在类的外部使用类名访问类中的静态属性。可以看到同一个类中的静态成员在每个对象中共享,每创建一个对象静态属性count就自增1,用来统计实例化对象的次数

  另外在使用静态方法时需要注意,在静态方法中职能访问静态成员。因为非静态的成员必须通过对象的引用才能访问,通常是使用$this完成的。而静态的方法在对象不存在的情况下也可以直接使用类名来访问,没有对象也就没有$this引用,没有了$this引用就不能访问类中的非静态成员,但是可以使用类名或self在非静态方法中访问静态成员

3、Const关键字

虽然const和static的功能不同。但使用的方法比较相似。在PHP中定义常量是通过调用define()函数来完成的,但要讲类中的成员属性定义为常量,则只能使用const关键字。将类中的成员属性使用const关键字标识为常量,其访问的方式和静态成员一样,都是通过类名或在成员方法中使用self关键字访问,也不能用对象来访问。标识为常量的属性是只读的,不能重新赋值,如果在程序中试图改变它的值,则会出现错误。所以在声明常量时一定要给初值,因为没有其他方式后期为常量赋值。注意,使用const声明的常量名称前不要使用”$”符号,而且常量名称通常都是大写的。在下面的示例中演示了类中如何声明常量,并在成员方法中使用self和在类外面通过类名来访问常量。

<?php

   //声明一个MyClass类,在类中声明一个常量,和一个成员方法

Class MyClass{       

   Const CONSTANT = “CONSTANT value”;     //使用const声明一个常量,并直接赋上初始值

   

    Function showConstant(){         //声明一个成员方法并在其内部访问本类中的常量

           Echo self::CONSTANT,”<br>”;        //使用self访问常量,注意常量前不要加”$”

}

}

Echo MyClass::CONSTANT.”<br>”;     //在类外部使用类名称访问常量,也不要加”$”

$class = new MyClass();           //通过类MyClass创建一个对象$class

$class->showConstant();           //调用对象中的方法

//echo $class::CONSTANT;    //通过对象名称访问常量是不允许的。

4、Instanceof关键字

使用这个关键字可以确定一个对象是类的实例、类的子类,还是实现了某个特定接口,并进行相应的操作。例如,假设希望了解名为$man的对象是否为类Person的实例:

$man = new Person();

If($man instanceof Person){

     Echo “$man是Person类的实例对象”;

}

在这里有两点值得注意,首先,类名没有任何定界符,使用定界符将导致语法错误。其次,如果比较失败,脚本将推出执行。Instanceof关键字在同时处理多个对象时特别有用,例如,你可能要重复地调用某个函数,但希望根据对象类型调整函数的行为。

     

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢