2016-03-31 41 views
-2

在PHP中,让我们有四个类A,B,C和D.它们都没有继承其他类。他们都是独立的班级。现在,我只想让B和C能够创建类A的对象。D不应该能够创建类A的对象。如何允许在PHP中只对特定类创建类的对象?

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

小小的帮助将不胜感激。

+0

对于投票的人,请让我知道为什么? –

+1

我觉得函数'debug_backtrace()'会帮助你在这里 –

+0

@ChetanAmeta Ok Lemmi检查出来。谢谢 –

回答

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 

这里上课A您可以根据您的要求把病情__construct

但恕我直言的继承和抽象是更好的选择任务。

+0

这看起来好像是工作,是@arkascha在他的回答中指出的。我会试试看,然后回来。 –

2

PHP没有提供任何明确的限制手段。

虽然这个问题(为什么人会想这样做?)听起来很奇怪,我在这里我可以想像两种可能的方法,既严重缺点:

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

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

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

  2. 您可以主动防止对象创建。再次两个变体:

    a)在类构造函数内抛出异常。一个非常粗鲁的事情要做...

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

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

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

+0

感谢您的解释。我将会讨论你提到的第二点。而且由于我在这个领域的经验不如你,你的第一点刚好超过了我的头。为了理解,您能否提供我可以阅读的任何链接? –

+0

你能否详细说明在第一点你不了解的究竟是什么? – arkascha

+0

当你说“在能够实例化某个类的对象之前必须知道类定义”之前,你是什么意思? –

相关问题