我有两个班,“A”和“B”。在应用程序逻辑中,除了类“A”之外,不允许任何人创建类“B”的对象。 但是,因为我不想在同一个文件中使用这两个类,所以我不能用“私有”特性来限制它。
是否有可能产生这种限制?如果其他人然后“A”试图创建类“B”的对象,你说小便!?
答案 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
}
}
}