php и использование композиции

#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, правильно, они каким-то образом заменяют глобальные переменные. Я лично использую их время от времени, но, конечно, вы не должны портить весь свой проект одиночными элементами.