常用关键字final、static、const、instanceof
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关键字在同时处理多个对象时特别有用,例如,你可能要重复地调用某个函数,但希望根据对象类型调整函数的行为。