3.6 常见的关键字和方法
在PHP中有很多的关键字,用来修饰类的属性和方法,如public、protected、static、private等。
3.6.1 final关键字
final关键字是PHP 5新增的。如果父类中的方法被声明为final,则子类无法覆盖该方法。如果一个类被声明为final,则不能被继承。
注意:属性不能被定义为final,只有类和方法才能被定义为final。
使用final标识的类,不能再被继承,也不能再有子类。例如下面代码:
在类中使用final标识的方法,在子类中不可以重写,也不能被覆盖。例如下面代码:
下面通过一个实例来介绍。在实例中,首先定义一个类Person,在类中定义一个say()方法,在前面加上final关键字;然后定义一个子类Man,在这个子类中覆盖父类中的say()方法。
【例3-12】(实例文件:ch03\Chap3.12.php)final关键字的应用。
在IE浏览器中输出的结果如下:
含义是不能覆盖最终方法Person::say()。
3.6.2 static关键字
static关键字的作用是将类的成员属性或成员方法标识为静态的。
使用static关键字标识的成员属性和成员方法在类内、类外调用的方法是不一样的。
在类外调用的方式如下:
【例3-13】(实例文件:ch03\Chap3.13.php)在类外调用static关键字标识的成员。
在IE浏览器中运行结果如图3-9所示。
在类内调用方式如下:
【例3-14】(实例文件:ch03\Chap3.14.php)在类内调用static关键字标识的成员。
在IE浏览器中运行结果如图3-10所示。
提示:在使用静态方法时需要注意,在静态方法中只能访问静态成员。因为非静态的成员必须通过对象的引用进行访问,通常是使用$this来完成。而静态的方法,在对象不存在的情况下也可以直接使用类名来访问,没有对象也就没有$this引用,没有$this引用就不能访问类中的非静态成员,但是可以使用类名或者self在非静态方法中访问静态成员。
图3-9 在类外调用static关键字标识的成员
图3-10 在类内调用static关键字标识的成员
3.6.3 单态设计模式
单态设计模式就是让类的一个对象成为系统中的唯一实例,避免大量的new操作而消耗内存资源,也方便设置钩子输出日志信息等。
实现单态设计模式需要满足以下三点:
(1)一个私有的静态的属性:用于保存仅有的一个实例化对象。
(2)一个私有的构造方法:确保用户无法通过创建对象对其进行实例化。
(3)一个公有的静态的方法:负责对其本身进行实例化。
【例3-15】(实例文件:ch03\Chap3.15.php)实现单态设计模式。
图3-11 实现单态设计模式
在IE浏览器中运行结果如图3-11所示。
从例3-15的结果可以发现,不管调用类的实例多少次,只实例化一次Example类。
3.6.4 const关键字
const是一个定义常量的关键字。调用const常量的方式和静态成员(static)的调用是一样的,在类外通过类名访问,在成员方法中使用self关键字进行访问。具体参考3.6.2节。
注意:const标识的常量是一个恒值,不能重新赋值,所以一定要在定义的时候初始化。使用const声明的常量名称前不能使用$符号,并且常量名通常都是大写的。
【例3-16】(实例文件:ch03\Chap3.16.php)const关键字的应用。
在IE浏览器中运行结果如图3-12所示。
图3-12 const关键字的应用
3.6.5 instanceof关键字
instanceof关键字有以下两个用法:
(1)判断一个对象是否是某个类的实例。
(2)判断一个对象是否实现了某个接口。
本节主要介绍第一个用法。使用instanceof关键字判断一个对象是某个类的实例时,返回true;否则返回false。
instanceof关键字语法格式如下:
【例3-17】(实例文件:ch03\Chap3.17.php)instanceof关键字的应用。
在IE浏览器中运行结果如图3-13所示。
图3-13 instanceof关键字的应用
3.6.6 克隆对象
在PHP5中,对象的传递方式默认为引用传递,如果想要在内存中生成两个一样的对象或者创建一个对象的副本,这时可以使用“克隆对象”。
克隆对象是通过关键字clone实现的。语法格式如下:
用clone克隆出来的对象与原对象没有任何关系,它是把原来的对象从当前的位置重新复制了一份,也就是相当于在内存中新开辟了一块空间。
克隆对象时,PHP会检查克隆的原对象中是否含有__clone()方法,如果不存在,就会调用默认的__clone()方法,复制对象的所有属性;如果__clone()方法已经定义过,那么__clone()方法就会执行定义的内容。
【例3-18】(实例文件:ch03\Chap3.18.php)克隆对象的应用。
在IE浏览器中运行结果如图3-14所示。
图3-14 克隆对象的应用
3.6.7 类中通用的__toString()方法
将一个对象当作一个字符串使用时,会自动调用__toString()方法,并且在该方法中,可以返回一定的字符串,以表明该对象转换为字符串之后的结果。
注意:如果将一个未定义__toString()方法的对象转换为字符串,会产生致命的错误。
【例3-19】(实例文件:ch03\Chap3.19.php)__toString()方法。
在IE浏览器中运行的结果为“对象当成字符串时调用”。
3.6.8 __call和__callStatic()方法
在类外部,对象方式调用一个不可访问方法时,__call()会被调用;用静态方式调用一个不可访问方法时,__callStatic()会被调用。__call()和__callStatic()的语法格式如下:
其中,$name参数是要调用的方法名称;$arguments参数是一个枚举数组,包含着要传递给$name方法的参数。
【例3-20】(实例文件:ch03\Chap3.20.php)__call()和__callStatic()方法的应用。
在IE浏览器中运行结果如图3-15所示。
图3-15 __call()和__callStatic()方法的应用
3.6.9 自动加载类
在编写面向对象的应用程序时,有时要引用某个类或类的方法,需要使用include或者require导入到文件才能使用。每用一个类就需要写一条include的语句,这样是很烦的一件事。
在PHP5中,可以定义一个__autoload()函数,它会在试图使用尚未被定义的类时自动调用。
下面通过一个实例进行介绍。
【例3-21】(实例文件:ch03\Chap3.21.php)自动加载类。
创建test.php和test1.php两个文件。
test.php文件中包含一个Test类,内容如下:
test1.php文件中包含一个Test1类,内容如下:
Chap3.21.php文件的内容如下:
在IE浏览器中运行结果如图3-16所示。
3.6.10 对象串行化
串行化对象是把对象转化成bytes数据。可以将串行化的数据存储在一个文件里或网络上传输,然后再反串行化还原为原来的数据。串行化对象使用serialize()函数来完成,反串行化对象使用unserialize()函数来完成。
图3-16 自动加载类
在执行串行化对象时,PHP会首先检查是否存在一个魔术方法__sleep(),如果存在,会先调用__sleep()方法。__sleep()方法可以用于清理对象,并返回一个包含对象中所有变量名称的数组。在执行反串行化对象时,PHP会检查是否存在一个__wakeup()方法,如果存在,则会先调用__wakeup()方法,预先准备对象数据。
这两个方法都不接受参数。__sleep()方法必须返回一个数组,包含需要串行化的属性。如果没有__sleep()方法,PHP将保存所有属性。
【例3-22】(实例文件:ch03\Chap3.22.php)对象串行化。
Chap3.22.php文件如下:
unserialize.php文件:
在IE浏览器中运行unserialize.php文件,结果如图3-17所示。
图3-17 对象串行化