37

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

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

PHPの場合

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

5 に答える 5

47

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

シングルトン パターン

クラスのインスタンスを 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実装からの簡略化された例

于 2012-09-23T14:46:53.717 に答える
36

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

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

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

これにより、クラスのインスタンスが1つだけになり、そのインスタンスへのグローバルアクセスポイントが提供されます。これは、シングルトンパターンで一般的です。

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

于 2012-09-23T14:38:11.170 に答える
4

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

__construct()このようにして、クラス自体の外部に誰も電話をかけられないことが確実になります。

于 2012-09-23T14:33:04.743 に答える
3

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

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

    $ token = Token :: generate();

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

于 2012-09-23T14:35:29.333 に答える
1

プライベートコンストラクターは、ほとんどの場合、またはファクトリを強制したい場合にシングルトンパターンを実装するためにここにあります。このパターンは、オブジェクトのインスタンスが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;
}
于 2012-09-23T14:35:20.027 に答える