PHP 从入门到项目实践(超值版)
上QQ阅读APP看书,第一时间看更新

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 对象串行化