在PHP中,有四个类A,B,C和D.它们都没有继承另一个。他们都是独立的班级。现在,我只希望B和C能够创建类A的对象.D不应该能够创建类A的对象。
可以用PHP完成吗?如果那么,怎么样?我尝试刷新面向对象的概念,但似乎无法在PHP中找到合适的答案。
很少有人会非常感激。
答案 0 :(得分:2)
PHP没有为此类限制提供任何明确的方法。
虽然这个问题对我来说听起来很奇怪(为什么会想要这样做?)我可以想象两种可能的方法,都有严重的缺点:
您可以尝试限制对类定义的访问: 在能够实例化某个类的对象之前,必须知道类定义。有两种策略:
a)显式包含语句在需要时加载类定义。显然,这可以通过基本系统来阻止。通过brute权限拒绝,所以如果你玩弄文件权限,虽然这会导致运行时错误。或者通过替换实际文件,例如使用根据需要更改的级联符号链接。
b)一些自动加载机制。这种情况显然允许实现一个额外的过滤步骤,它可能会加载一些假的类定义,或者只是在拒绝访问目标类的情况下抛出错误。您可以主动阻止对象创建。同样有两个变种:
a)在类构造函数中抛出异常。一件非常粗鲁的事情......
b)遵循工厂模式并声明类构造函数是非公共的,并且只提供静态生成器方法作为实例化类对象的唯一方法。这更透明,方法可以引发异常或拒绝返回预期结果。
为此,您显然需要一些信息,您可以决定是否应该授予请求。应该可以评估执行堆栈以检测触发对象创建的代码部分。对该信息进行词汇分析或与某些目录进行比较可构成决策的基础。
但正如开头所说:所有方法都有缺点。这听起来更像是对可能性的错过使用......虽然......有可能进行探索,对吧? ; - )
答案 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
在__construct
班A
中,您可以根据自己的要求设置条件。
但是IMHO继承和抽象是这项任务的更好选择。