Снова классы: передача объекта по ссылке ....

StUV

Rotaredom
Снова классы: передача объекта по ссылке ....

Почему не работает такой пример:
PHP:
<?php
  class out
  {
    var $tree;
    function out(&$ref)
    {
      $this->tree = $ref;
    }
    function prn()
    {
      echo $this->tree->node;
    }
  }

  class tree
  {
    var $out;
    var $node;
    function tree()
    {
      $this->out = new out($this);
    }
  }
  $st = new tree;
  $st->node = "somestring";
  $st->out->prn();
?>
(в браузер ничего не выводится, хотелось бы увидеть somestring
если неочевиден смысл примера могу пояснить...
Всем спасибо
 

Crazy

Developer
PHP:
<?php 
  class out 
  { 
    var $tree; 
    function out(&$ref) 
    { 
      $this->tree =& $ref; 
    } 
    function prn() 
    { 
      echo $this->tree->node; 
    } 
  } 

  class tree 
  { 
    var $out; 
    var $node; 
    function setup() 
    {
      $this->out = new out($this); 
    }

  } 
  $st = new tree;
  $st->setup(); 
  $st->node = "somestring"; 
  print_r($st);
  $st->out->prn(); 
?>
 

StUV

Rotaredom
2Crazy:
спасибо, понял...
только - setup - это встроенная функция ? (почему-то в доках на пхп.нет ее нет, а она "хайлайтится" у меня в winsyntax'e)
если да, то где про нее почитать ?
еще раз спасибо
 

si

Administrator
или так:
PHP:
<?php 
  class out 
  { 
    var $tree; 
    function out(&$ref) 
    { 
      $this->tree = &$ref; 
    } 
    function prn() 
    { 
      echo $this->tree->node; 
    } 
  } 

  class tree 
  { 
    var $out; 
    var $node; 
    function tree() 
    { 
      $this->out = new out($this); 
    } 
  } 
  $st = &new tree; 
  $st->node = "somestring"; 
  $st->out->prn(); 

?>
 

Screjet

Новичок
кстати в ПХП5 конструкции
PHP:
$st = & new tree;
и
PHP:
$st = new tree;
эквивалентны
 

deek

Новичок
добавление к Crazy:

в ПХП, как в C++, и наверное, много еще где, запрещено передавать куда-либо $this из конструктора.

в С++ можно при этом можно получить совершенно дикие ошибки, в пхп вроде даже warning не генерируется. просто не передается, и все.
 

rihad

Guest
Почему это нельзя из конструктора передавать $this? Вот кусочек моего кода, все нормально работает:
PHP:
	class docs_database_form extends database_form
	{
		function docs_database_form()
		{
			parent::database_form(new docs_database($this));
		}
Конечно надо быть осторожным и всегда помнить о разнице передачи по значению и ссылке. Вот что я терпеть не могу в ПХП (помимо прочих вещей), так это то, что конструкторы базовых классов не вызываются автоматически. Неудобно.

Проблема OP в том, что раз уж начал использовать ссылки, то придерживайся их во всей цепочке. Вот работающий код:

PHP:
<?php 
  class out 
  { 
    var $tree; 
    function out(&$ref) 
    { 
      $this->tree = [b]&[/b]$ref; 
    } 
    function prn() 
    { 
      echo $this->tree->node; 
    } 
  } 

  class tree 
  { 
    var $out; 
    var $node; 
    function tree() 
    { 
      $this->out = new out($this); 
    } 
  } 
  $st = [b]&[/b]new tree; 
  $st->node = "somestring"; 
  $st->out->prn(); 
?>
Два добавленных мной оператора & выделены болдом.
 

deek

Новичок
в общем, полный бардак.

имхо, стоит использовать ссылку на this в конструкторе, и тем более передавать ее в другие конструкторы, только будучи полностью увереным в схеме инициализации этого объекта, и объектов, которые аггрегируются.

иначе, по-моему, лучше в конструкторе заниматься только первоначальной инициализацией объекта, созданием аггрегируемых объектов, открытием ресурсов. а ссылки на this передавать только из другого метода, скажем, initialize.

в общем, дело вкуса.
 
Сверху