1

2009年に構築されたウェブサイトのソースコードを調べています。これはカスタムフレームワークでした。

違いはなんですか?

<?php
class DbAccess {

    private static $instance;

    /**
     * Returns the instance of the DB Class
     */

    public static function getInstance()
    {
        self::$instance = new DbAccess();
        return self::$instance;
    }
}

V / s

<?php
class DbAccess {


    /**
     * Returns the instance of the DB Class
     */

    public static function getInstance()
    {
        return new DbAccess();
    }

}

私はいくつかのカスタムメイドのフレームワークと異なるパターンのライブラリのセットに取り組んできましたが、インスタンスを返す方法が経由であるのを見たことがself::$instanceあり、時には直接経由で戻ってきたのを見ましたnew

どちらが良い習慣ですか?PHPの今後のバージョンを検討しています。

4

3 に答える 3

5

OOPについて話すとき、どちらも良い習慣ではありません。他の人がすでに指摘している最初の方法は、誰かがシングルトンパターンを実装しようとして失敗したように見えます。OOPの観点からシングルトンの何がそんなに悪いのか。密結合、隠れた依存関係、およびグローバル状態を導入します。基本的に、これはキーワードを使用するためglobalのすばらしい方法です。

次に、2番目の例を示します。それは基本的に同じことですが、まったく同じ欠点があります。

どちらの例も、メソッドが呼び出されるたびに新しいデータベース接続を作成することに注意してください。これは...最適ではありません。

今、私がしたことは次のようなものです(依存性注入を使用):

データベースへのアクセスが必要なクラスがあるとしましょう。次のようにします。

class Foo
{
    private $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function methodWhichNeedsDatabaseAccess()
    {
        // do something with $this->db
    }

}

// or whatever instance for database access you are using
$db = new PDO(dsn);
$foo = new Foo($db);
$foo->methodWhichNeedsDatabaseAccess();
于 2013-03-05T11:23:17.130 に答える
0

静的関数は両方とも、オブジェクトの新しいインスタンスを返します。最初の例では、そのインスタンスを将来再び静的に参照できますが、プライベート静的に格納されているため、そのクラス内のメンバー(関数)からのみアクセスできます。

于 2013-03-05T06:10:29.550 に答える
0

最初の例はシングルトンの例のように見えますが、存在する場合は通常のラッパーにラップされていません。シングルトンは、クラスのインスタンスを1つだけ作成する場合に適しています。

public static function getInstance() {
  if (!isset(self::$instance))
    self::$instance = new DbAccess();
  return self::$instance;
}

これが機能する方法は、その1つのインスタンスを介してのみこのクラスにアクセスできることです(同じデータベースへの複数の接続を開かないようにするため)。

コンストラクターを制御したい場合は、2番目のパターンに従うことができます。コンストラクターをプライベートにすることができます(そのクラスのみがコンストラクターを呼び出して新しいオブジェクトを作成できるようにします)。これは工場では一般的です。

于 2013-03-05T06:11:30.587 に答える