7

「A」と「B」の2つのクラスがあります。アプリケーションロジックでは、クラス「A」を除いて、クラス「B」のオブジェクトを作成することはできません。しかし、同じファイルに2つのクラスを含めたくないので、「プライベート」な性質でそれを制限することはできません。

この種の制限を作成することは可能ですか?「A」以外の誰かがクラス「B」のオブジェクトを作成しようとすると、あなたは腹を立てると言います!?

4

5 に答える 5

7

これは非常にハックであり、使用しないでください。私はハックなものが好きなので、投稿するだけです ;) さらに、E_STRICTエラー報告が有効になっている場合、これはエラーをスローします:

class B
{
    private function __construct() {}

    public function getInstance() {
        if (!isset($this) || !$this instanceof A) {
            throw new LogicException('Construction of B from a class other than A is not permitted.');
        }

        return new self;
    }
}

class A
{
    function someMethod() {
        $b = B::getInstance(); // note that I'm calling the non-static method statically!
    }
}

これが機能する理由は、このマニュアル ページの 2 番目の例に見られる「機能」にあります。

于 2010-10-15T16:34:44.330 に答える
5

バックトレースを調べることができます:

class B
{
    public function __construct()
    {
        $chain = debug_backtrace();
        $caller = $chain[1]['class'];

        if ('A' != $caller) {
            throw new Exception('Illegal instantiation');
        }
    }
}
于 2010-10-15T15:35:57.787 に答える
0

たぶんあなたはこのようなものを使いたいでしょう:

class A
{
        protected function __construct ()
        {
        }
}

class B extends A
{
        public function __construct ()
        {
                $a = new A();
        }
}

$b = new B();
于 2010-10-15T21:35:52.177 に答える
0

B のコンストラクターで、A を渡す必要があります。次に、A から B を取得する場合は、B を作成して A を渡すだけです。新しい B が呼び出されると、A を渡す必要があります。

class A
{
    private $b;

    private function getB()
    {
        if (null === $this->b)
        {
            $this->b    = new B($this);
        }

        return $this->b;
    }
}

class B
{
    public function __construct(A $a)
    {

    }
}
于 2010-10-15T15:12:26.453 に答える
-1

get_called_classオブジェクトをインスタンス化しようとしているクラスを見つけるために使用します。

class B
{
        public function __construct ()
        {
                if(get_called_class() != 'A') {
                    //booboo
                }
        }
}
于 2010-10-16T00:29:36.663 に答える