要访问类中的任何方法或属性,我们必须创建一个对象实例(用new关键字,比如$obj=new emailer()),否则就不能访问它们。
但是如果把方法和属性定义为静态,开发者就可以直接访问,不需要创建这个类的任何实例,就像是一个静态成员为该类的全局成员一样。此外,静态属性会保持被分配的最后状态,这在某些情况下非常有用。
你可能会问,为什么要有静态方法?其实静态方法常被用来描述最实用的方法,用来执行一个非常具体的任务,或者返回一个特定的对象(静态属性和方法常用于设计模式)。
还举前面的例子,我们的应用中需要同时支持3种数据库,MySQL、PostgreSQL和SQLite。现在,我们需要在同一时间使用一个数据库驱动类。
为此,我们设计一个DBManager类,它可以实例化任何请求,并返回到调用的脚本中,如代码清单2-20所示:
代码清单2-20 DBManager数据库代理类
<?php //class.dbmanager.php class DBManager { public static function getMySQLDriver(){ //初始化MySQL驱动对象并返回 } public static function getPostgreSQLDriver(){ //初始化PostgreSQL驱动对象并返回 } public static function getSQLiteDriver(){ //初始化SQL Lite驱动对象并返回 } }?>
我们如何使用这个类,刚才已经说了,直接访问,访问静态属性和方法,使用::运算符即可。具体使用方法如代码清单2-21所示:
代码清单2-21 访问静态属性和方法
<?php //test.dbmanager.php include_once("class.dbmanager.php"); $dbdriver = DBManager::getMySQLDriver(); //注意两个冒号的关键字 ?>
聪明的你可能也注意到了,我并没有创建任何DBManager对象的实例,以前是这样的:
$dbmanager = new DBManager()
而这里我们直接访问它的方法,使用::静态引用关键字就可以,有的书里说成是符,具体叫什么看个人喜好。
那么,使用静态方法究竟有多大的好处?很明显,我们只需要一个驱动程序对象,没必要再创建一个新的DBManager对象,不用占内存,也能让脚本正常运行。
静态方法通常执行特定任务。
再提醒一下大家,如果是静态方法或属性,就不能使用$this来访问了。因为没有实例化类,$this会出现比较奇怪的事情。那么在类中如何存取静态属性和方法呢,来看代码清单2-22:
代码清单2-22 类中访问静态属性
<?php //class.statictester.php class StaticTester { private static $id=0; function __construct(){ self::$id +=1; } public static function checkIdFromStaticMehod(){ echo "Current Id From Static Method is ".self::$id."\n"; } public function checkIdFromNonStaticMethod(){ echo "Current Id From Non Static Method is ".self::$id."\n"; } } $st1 = new StaticTester(); StaticTester::checkIdFromStaticMehod(); $st2 = new StaticTester(); $st1->checkIdFromNonStaticMethod(); //returns the val of $id as 2 $st1->checkIdFromStaticMehod(); $st2->checkIdFromNonStaticMethod(); $st3 = new StaticTester(); StaticTester::checkIdFromStaticMehod(); ?>
运行以上脚本后,你会看到输出如下:
Current Id From Static Method is 1 Current Id From Non Static Method is 2 Current Id From Static Method is 2 Current Id From Non Static Method is 2 Current Id From Static Method is 3
每当我们创建一个新实例,它影响到所有的变量声明为静态实例。使用这种特殊的驱动程序,设计模式“单例”就是使用了这一特点。