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