PHP オブジェクト指向 – シングルトン パターン
クラスにインスタンスが 1 つだけあることを保証します
1. クラスが無限にインスタンス化できるという問題を解決するには?
New は一度だけインスタンス化できます。ユーザーが New を無制限に使用できないようにするにはどうすればよいですか?
コンストラクターをプライベート化します。すべての外部の新しい操作は失敗します
クラスMySQLDB
{
プライベート関数__construct()
{
}
}
2. コンストラクターがプライベート化されると、そのクラスはクラス外でインスタンス化できなくなります。ただし、クラス内でインスタンス化することはできます。
パブリック静的メソッドを追加し、クラスを通じてメソッドを呼び出し、メソッド内で新しい操作を実行します。
クラスMySQLDB
{
プライベート関数__construct()
{
}
パブリック静的関数getInstance()
{
新しい MySQLDB を返します;
}
}
$o = MySQLDB::getInstance();
この時、ユーザーがこのクラスのオブジェクトを必要とする場合にはメソッド内のコードが実行されるため、メソッド内のロジックを改良することでユーザーによるオブジェクトの取得操作を制限することができます。
3. 上記のメソッドでは、実行されるたびにクラスがオブジェクトをインスタンス化したかどうかを判断し、インスタンス化されている場合はインスタンス化されたオブジェクトを直接返します。インスタンス化されていない場合は、新しいインスタンスを作成して戻ります。
どうやって判断するの?
このオブジェクトをインスタンス化したら保存します。
例:
クラスMySQLDB
{
プライベート静的 $instance;
プライベート関数__construct()
{
}
パブリック静的関数getInstance()
{
if(!self::$instanceinstanceofself)
{
self::$instance= 新しい自己;
}
self::$instance を返す;
}
}
4. クローン作成では新しいオブジェクトも取得できるため、クローン作成を制限する必要があります。
プライベート __clone() メソッド
クラスMySQLDB
{
プライベート静的 $instance;
プライベート関数__construct()
{
}
プライベート関数__clone()
{
}
パブリック静的関数getInstance()
{
if(!self::$instanceinstanceofself)
{
self::$instance= 新しい自己;
}
self::$instance を返す;
}
}