限制可以创建PHP类的内容

时间:2010-10-15 15:03:29

标签: php class restriction

我有两个班,“A”和“B”。在应用程序逻辑中,除了类“A”之外,不允许任何人创建类“B”的对象。 但是,因为我不想在同一个文件中使用这两个类,所以我不能用“私有”特性来限制它。

是否有可能产生这种限制?如果其他人然后“A”试图创建类“B”的对象,你说小便!?

5 个答案:

答案 0 :(得分:7)

这就像它得到的那样hacky而你不应该使用它。我只发布它,因为我喜欢hacky的东西;)此外,如果启用了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!
    }
}

这可行的原因是可以看到in the second example of this manual page的“特征”。

答案 1 :(得分:5)

您可以检查回溯:

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

        if ('A' != $caller) {
            throw new Exception('Illegal instantiation');
        }
    }
}

答案 2 :(得分:0)

在B的构造函数中,要求传入A。当你想从A获得B时,只需创建一个B并传入A.当调用新的B时,它将需要传入。 / p>

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)
    {

    }
}

答案 3 :(得分:0)

也许你想要使用这样的东西:

class A
{
        protected function __construct ()
        {
        }
}

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

$b = new B();

答案 4 :(得分:-1)

使用get_called_class找出试图实例化对象的类:

class B
{
        public function __construct ()
        {
                if(get_called_class() != 'A') {
                    //booboo
                }
        }
}