php类名:: static Function() - > public Function()这是做什么的?

时间:2012-05-21 19:18:22

标签: php

我正在阅读php设计模式,我看到了这段代码:

<?php
require_once("DB.php");

class DatabaseConnection
{
  public static function get()
  {
    static $db = null;
    if ( $db == null )
      $db = new DatabaseConnection();
    return $db;
  }

  private $_handle = null;

  private function __construct()
  {
    $dsn = 'mysql://root:password@localhost/photos';
    $this->_handle =& DB::Connect( $dsn, array() );
  }

  public function handle()
  {
    return $this->_handle;
  }
}

print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
?>

我理解除了最后两个印刷语句之外的所有内容。我一直在搞乱它,但我不理解静态函数以某种方式调用公共非静态函数。

我注意到我能做到:

DatabaseConnection::get()->get()->get()->handle();

但我不能这样:

DatabaseConnection::get()->handle()->get();

除了调用get函数然后调用handle函数之外,我只是不明白这是做什么的。

2 个答案:

答案 0 :(得分:3)

这是有效的,因为静态函数返回一个新对象。这种类型的构造通常被称为Singleton,因为它试图强制只有DatabaseConnection的一个实例可用。

请注意,构造函数是私有的,因此除非您已经在类中,否则无法显式调用new DatabaseConnection()。使用Singleton的解决方案将具有一个属性,初始为null,然后在对象实例化时设置为非null值。 &#39; getInstance&#39; (或者在这种情况下为get)方法仅在属性为null时才返回新对象。

答案 1 :(得分:1)

DatabaseConnection::get()创建DatabaseConnection的实例并将其返回。

所以......

DatabaseConnection::get()->handle();

......也可以写成如下......

$db = DatabaseConnection::get();
$db->handle();