如何允许在PHP中的特定类上创建类的对象?

时间:2016-03-31 06:10:31

标签: php algorithm class oop design-patterns

在PHP中,有四个类A,B,C和D.它们都没有继承另一个。他们都是独立的班级。现在,我只希望B和C能够创建类A的对象.D不应该能够创建类A的对象。

可以用PHP完成吗?如果那么,怎么样?我尝试刷新面向对象的概念,但似乎无法在PHP中找到合适的答案。

很少有人会非常感激。

2 个答案:

答案 0 :(得分:2)

PHP没有为此类限制提供任何明确的方法。

虽然这个问题对我来说听起来很奇怪(为什么会想要这样做?)我可以想象两种可能的方法,都有严重的缺点:

  1. 您可以尝试限制对类定义的访问: 在能够实例化某个类的对象之前,必须知道类定义。有两种策略:

    a)显式包含语句在需要时加载类定义。显然,这可以通过基本系统来阻止。通过brute权限拒绝,所以如果你玩弄文件权限,虽然这会导致运行时错误。或者通过替换实际文件,例如使用根据需要更改的级联符号链接。

    b)一些自动加载机制。这种情况显然允许实现一个额外的过滤步骤,它可能会加载一些假的类定义,或者只是在拒绝访问目标类的情况下抛出错误。

  2. 您可以主动阻止对象创建。同样有两个变种:

    a)在类构造函数中抛出异常。一件非常粗鲁的事情......

    b)遵循工厂模式并声明类构造函数是非公共的,并且只提供静态生成器方法作为实例化类对象的唯一方法。这更透明,方法可以引发异常或拒绝返回预期结果。

  3. 为此,您显然需要一些信息,您可以决定是否应该授予请求。应该可以评估执行堆栈以检测触发对象创建的代码部分。对该信息进行词汇分析或与某些目录进行比较可构成决策的基础。

    但正如开头所说:所有方法都有缺点。这听起来更像是对可能性的错过使用......虽然......有可能进行探索,对吧? ; - )

答案 1 :(得分:1)

我认为这里函数debug_backtrace会对你有帮助。看看下面的例子。

class A
{
    public function __construct()
    {
        echo debug_backtrace()[1]['class'];
    }
}

class B
{
    public function createObj()
    {
        $obj = new A();
    }
}

class C
{
    public function createObj()
    {
        $obj = new A();
    }
}

class D
{
    public function createObj()
    {
        $obj = new A();
    }
}

$o = new B();
$o->createObj(); //echo B

$o = new C();
$o->createObj(); //echo C

$o = new D();
$o->createObj(); //echo D

__constructA中,您可以根据自己的要求设置条件。

但是IMHO继承和抽象是这项任务的更好选择。