我有2个类,其中一个女巫接收另一个对象作为参数。
$a = new A();
$b = new B($a);
现在出现了一种情况,需要从类A的构造函数中调用类B。
这可能吗?有一种方法可以做到这样
$b = new B($this);
在A类的构造函数中?
答案 0 :(得分:2)
您可以将当前对象作为参数传递给另一个类。例如:
class A
{
public function __construct()
{
$b = new B($this);
}
}
class B
{
public function __construct(A $a)
{
//some code
}
}
但是,更好的方法是在A类中创建工厂方法,该方法将封装对象制作的逻辑。例如:
class A
{
protected function makeB()
{
return new B($this);
}
public function __construct()
{
$b = $this->makeB();
}
}
当然,正如@NigelRen所说,如果您想在其他地方使用这些类,则关闭链接是不好的做法。必须牢记这一点。
答案 1 :(得分:0)
是的,确实可以,但是请注意,您要执行的操作将导致递归。
int repetitions = 1000000000;
for (int i = 0; i < repetitions*10; i++) {
Move move3 = new Move(2, 3);
int sum3 = move3.x + move3.y;
}
// object block
long start = System.nanoTime();
for (int i = 0; i < repetitions; i++) {
Move move2 = new Move(2, 3);
int sum2 = move2.x + move2.y;
}
System.out.println("Object took " + (System.nanoTime() - start) + "ns");
// array block
long start2 = System.nanoTime();
for (int i = 0; i < repetitions; i++) {
int[] move = new int[]{2, 3};
int sum = move[0] + move[1];
}
System.out.println("Array took " + (System.nanoTime() - start2) + "ns");
哪个输出:
<?php
class A
{
/** @var B $b */
private $b;
public function __construct()
{
$this->b = new B($this);
}
public function getB()
{
return $this->b;
}
}
class B
{
/** @var A $a */
private $a;
/** @var A $a */
public function __construct(A $a)
{
$this->a = $a;
}
}
$a = new A();
$b = new B($a);
var_dump($a);
var_dump($a->getB());
在这里自己检查https://3v4l.org/36e9a