web-dev-qa-db-ja.com

コンストラクタをプライベートにする必要があるのはなぜですか? PHP

可能性のある複製:
PHP5クラスでは、プライベートコンストラクターはいつ呼び出されますか?

OOPについて最近読んでいて、このプライベートコンストラクターのシナリオに出くわしました。Googleで検索しましたが、PHPに関連するものは何も見つかりませんでした。

PHPで

  • プライベートコンストラクターを定義する必要があるのはいつですか?
  • プライベートコンストラクターを使用する目的は何ですか?
  • プライベートコンストラクタを使用することの長所と短所は何ですか?
31
Techie

いつプライベートコンストラクタを定義する必要がありますか?

class smt 
{
    private static $instance;
    private function __construct() {
    }
    public static function get_instance() {
        {
            if (! self::$instance)
                self::$instance = new smt();
            return self::$instance;
        }
    }
}

プライベートコンストラクタを使用する目的は何ですか?

これは、クラスのインスタンスが1つだけ存在できることを保証し、そのインスタンスへのグローバルアクセスポイントを提供します。これはシングルトンパターンと共通です。

プライベートコンストラクタを使用することの長所と短所は何ですか?

30
Baba

コンストラクターをプライベートにしたいシナリオがいくつかあります。一般的な理由は、場合によっては、外部コードでコンストラクターを直接呼び出さずに、別のメソッドを使用してクラスのインスタンスを取得するように強制することです。

シングルトンパターン

クラスのインスタンスを1つだけ存在させたい場合:

class Singleton
{
    private static $instance = null;

    private function __construct()
    {
    }

    public static function getInstance()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }

        return self::$instance;
    }
}

工場法

クラスのインスタンスを作成するためのいくつかのメソッドを提供したい、および/またはインスタンスを作成する方法を制御したい、それを正しく呼び出すにはコンストラクターの内部知識が必要になるため:

class Decimal
{
    private $value; // constraint: a non-empty string of digits
    private $scale; // constraint: an integer >= 0

    private function __construct($value, $scale = 0)
    {
        // Value and scale are expected to be validated here.
        // Because the constructor is private, it can only be called from within the class,
        // so we can avoid to perform validation at this step, and just trust the caller.

        $this->value = $value;
        $this->scale = $scale;
    }

    public static function zero()
    {
        return new self('0');
    }

    public static function fromString($string)
    {
        // Perform sanity checks on the string, and compute the value & scale

        // ...

        return new self($value, $scale);
    }
}

BigDecimal の簡略化された例 brick/math の実装

35
Benjamin

プライベートコンストラクターは主に シングルトンパターン で使用されます。この場合、クラスを直接インスタンス化する必要はなく、getInstance()メソッドを介してアクセスします。

これにより、クラス自体の外では誰も__construct()を呼び出せないことが確実になります。

4
moonwave99

プライベートコンストラクターは2つの条件で使用されます

  1. シングルトンパターンを使用する場合この場合、オブジェクトは1つしかなく、オブジェクトは通常getInstance()関数によって作成されます。
  2. オブジェクトを生成するためにファクトリ関数を使用する場合この場合、複数のオブジェクトが存在しますが、オブジェクトは静的関数によって作成されます。

    $ token = Token :: generate();

これにより、新しいTokenオブジェクトが生成されます。

2
Joyce Babu

ほとんどの場合、またはファクトリーを強制したい場合は、プライベートコンストラクターがシングルトンパターンを実装します。このパターンは、オブジェクトのインスタンスが1つしかないことを確認する場合に役立ちます。これは次のように実装されています:

class SingletonClass{
    private static $instance=null;
    private function __construct(){}

    public static function getInstance(){
        if(self::$instance === null){
            self::$instance = new self; 

        }
        return self::$instance;
}
1
artragis