1

我正在阅读 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 函数然后调用句柄函数。

4

2 回答 2

3

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

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

于 2012-05-21T19:32:46.110 回答
1

DatabaseConnection::get()创建一个实例DatabaseConnection并返回它。

所以...

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

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

$db = DatabaseConnection::get();
$db->handle();
于 2012-05-21T19:30:04.257 回答