购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.13 静态方法和属性

要访问类中的任何方法或属性,我们必须创建一个对象实例(用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

每当我们创建一个新实例,它影响到所有的变量声明为静态实例。使用这种特殊的驱动程序,设计模式“单例”就是使用了这一特点。 BS6zreshKWlSifpoDD8JJ8JewvOnjiYg2nx+YQjw3yVURVRT2qbup1BftMI9w2HL

点击中间区域
呼出菜单
上一章
目录
下一章
×