Ссылочный проход PHP делает новый экземпляр объекта? - PullRequest
0 голосов
/ 16 июня 2011

У меня есть ParentClass, и когда я создаю новый объект, я хочу передать ссылку на ParentClass.(Я должен использовать вещи ParentClass в новом объекте)

Я использую конструктор для создания этого объекта и передачи ссылочного значения.(это важно для меня)

Но когда я использую оператор =&, он создает новый экземпляр класса ParentClass, который вызывает конструктор, и затем это бесконечная рекурсия.Вот мой код:

<?php

abstract class MainClass {

    function __construct(&$parent){
        $this->parent =& $parent;
        $this->init();
    }

    abstract protected function init(); 

}

class ParentClass extends MainClass {   

    protected function init(){
        $this->child = new ChildClass($this);
    }

}

class ChildClass extends MainClass {

    protected function init(){}

}


$parent = new ParentClass (new stdClass());
var_dump($parent);

?>

И результат:

object(ParentClass)#1 (2) {
  ["parent"]=>
   object(stdClass)#2 (0) {
  }
  ["child"]=>
   object(ChildClass)#3 (1) {
     ["parent"]=>
     object(ParentClass)#1 (2) {
       ["parent"]=>
       object(stdClass)#2 (0) {
       }
       ["child"]=>
       object(ChildClass)#3 (1) {
         ["parent"]=>
         *RECURSION*
       }
     }
   }
 }

Как я могу решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Объекты передаются по ссылке по умолчанию. Нет причин передавать или присваивать $parent по ссылке. Так что этого должно быть достаточно:

abstract class MainClass {

    function __construct($parent){
        $this->parent = $parent;
        $this->init();
    }

Для вас может быть важно использовать &$parent, но это совершенно не нужно.


Относительно рекурсии: в вашем коде нет рекурсии, это рекурсия в выводе .

Эта часть:

object(ChildClass)#3 (1) {                // <--- the same element
    ["parent"]=>
    object(ParentClass)#1 (2) {
      ["parent"]=>
      object(stdClass)#2 (0) {
      }
      ["child"]=> 
      object(ChildClass)#3 (1) {          // <--- the same element
        ["parent"]=>
        *RECURSION*
      }
    }
  }

будет печататься снова и снова, потому что дочерний элемент имеет ссылку на своего родителя, а родительский элемент - на своего дочернего элемента.

Возможно, еще более очевидны повторяющиеся числа в выводе:

object(ParentClass)#1            // 1
  object(stdClass)#2             // 2
  object(ChildClass)#3           // 3
    object(ParentClass)#1        // 1
      object(stdClass)#2         // 2
      object(ChildClass)#3       // 3
        // what would be here? right, object(ParentClass)#1 again

Это нормально, проблем нет.

0 голосов
/ 16 июня 2011

Лучший дизайн.

Вам не нужна ссылка на родительский класс. Если есть методы, которым нужно что-то подобное, то это должны быть статические методы, которые охватывают все дочерние объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...