#php
#php
Вопрос:
Итак, у меня есть следующее, что выдает ошибки, но, похоже, php должен признать, что ему нужна только одна копия. Должен ли я создать это как ссылку, чтобы удалить циклическое создание новых объектов?
<?php
class A {
public function __construct(){
echo "within A<br />";
$this->b=new amp;B();
}
}
class B{
public function __construct(){
echo "within B<br />";
$this->a=new A();
}
}
$jt=new A();
$ar=new B();
спасибо
редактировать — ? можно было бы спросить лучше. Я в курсе большинства поднятых проблем. Перейдем к статическим функциям.
Комментарии:
1. когда вы это делаете
new …()
, вы указываете php создать новый объект с типом этого класса. откуда предполагается, что вам нужен только один экземпляр B? (подсказка: используйте шаблон singleton)2. Вероятно, вы захотите передать
A
объект вB
или наоборот в качестве параметра конструктора, а не безоговорочно создавать новые экземпляры другого класса в конструкторе.3. И это должно быть
$this->b =amp; new B();
4. Объекты всегда являются ссылками.
amp;
больше не требуется (и не рекомендуется) почти во всех случаях.
Ответ №1:
Сделайте это следующим образом:
<?php
class A {
public function __construct(){
echo "within A<br />";
}
public function setB(B $b) {
$this->b = $b;
}
}
class B{
public function __construct(A $a){
echo "within B<br />";
$this->a = $a;
}
}
$a=new A();
$b=new B($a);
$a->setB($b);
Как и другие, уже упомянутые в комментариях:
- Вам не нужно,
amp;
поскольку объекты всегда являются ссылками - PHP не может знать, чего вы хотите, new всегда создает новый объект
- Если вы хотите ограничить количество объектов класса, используйте шаблон singleton
Комментарии:
1. Я согласен с большей частью этого, но синглтоны противоречивы. Я бы не стал заходить так далеко, чтобы говорить, что вам никогда не следует их использовать, но вы, безусловно, должны использовать их экономно. В большинстве случаев вам не нужны синглтоны, просто немного осторожности.
2. @Gordon, правильно, они каким-то образом заменяют глобальные переменные. Я лично использую их время от времени, но, конечно, вы не должны портить весь свой проект одиночными элементами.