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" );
?>

最後の2つのprintステートメントを除いてすべて理解しています。私はそれをいじっていますが、どういうわけかパブリック非静的関数を呼び出す静的関数を理解していません。

私ができることに気づきました:

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

しかし、私はそのようなことはできません:

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

get関数を呼び出してからhandle関数を呼び出す以外は、これが何をしているのか理解できません。

4

2 に答える 2

3

これは、静的関数が新しいオブジェクトを返すために機能します。このタイプの構造は、通常、シングルトンと呼ばれDatabaseConnectionます。これは、aのインスタンスが1つだけ使用可能になるように強制しようとしているためです。

コンストラクターはプライベートであるため、new DatabaseConnection()既にクラス内にいない限り、明示的に呼び出すことはできません。シングルトンを利用するソリューションには、最初は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 に答える