3

私が持っている場合:

abstract class AbstractSingleton
{
    protected static $instance;

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

    protected function __construct() { }
}

クラスを拡張するユーザーは、の可視性を再定義できます__constructか?

class Singleton extends AbstractSingleton
{
    public function __construct() { } // That would be a problem
}

__construct2 つ目の質問ですが、AbstractSingleton でプライベートとして定義されている場合、サブクラスはどうなりますか? コンストラクターがまったくないのですか?クラスに新しいデフォルト コンストラクターが提供されていますか。提供されている場合、どのような可視性がありますか?

4

2 に答える 2

4

まず、メソッドから参照 ( ) を返す必要はありません&。PHP 5 以降、オブジェクトはデフォルトで参照によって渡され、返されます。

実際の質問に対して、子が親のメンバーにアクセスするには、そのアクセス修飾子を少なくとも保護する必要があります。それはコンストラクターにも当てはまります。したがって、あなたの場合、サブクラスは次のことができます。

abstract class AbstractSingleton
{
    protected __ construct() {}
}

class Singleton extends AbstractSingleton
{
    public __construct()
    {
        parent::__construct();

        // more code
    }
}

finalそれを回避する方法は、キーワードを使用することです。参照: PHP ドキュメント

2 番目の質問については、AbstractSingleton のコンストラクターをプライベートにして、その子でコンストラクターを呼び出そうとすると、いつものように、代わりにデフォルトのパブリック コンストラクターが使用されます。

編集:そうは言っても、特にPHPでは、シングルトンはほとんど良い考えではありません。おそらく、参照によって自動的に渡される/返される PHP オブジェクトを利用するだけで、問題を解決できる可能性があります。そうでない場合、依存性注入は、はるかに OOP に適した代替手段です。

于 2012-12-04T21:08:00.463 に答える
3

__construct() をfinalにすると、サブクラスはこのメソッドをオーバーライドできなくなります。http://php.net/manual/en/language.oop5.final.php

PHP では、サブクラスでレベルを上に変更できます (親のプライベートからサブクラスのパブリックに変更できます) が、逆に変更することはできません。

編集 - __construct() を非公開にする場合、そのクラス内以外の場所では実行できませんnew Class()

于 2012-12-04T21:05:57.113 に答える