Получить объект класса в конструкторе самого класса

iceman

говнокодер
& - он те зачем?
и о какой рекурсии ты говоришь? ты передаешь Load в object опять же объект Load?
 

Савелей

Новичок
зацикливание...

вот пример:

PHP:
class Load
{
 var $_object = null;

  function __construct($object)
  {
   $this->_object = $object; /* ??????? */
  /* если написать $GLOBALS['_object'] = $object; и далее в методах писать GLOBALS['_object']->$var = $var; то все как мне нужно, но это криво как то...*/

  }

  function set_var($var)
	{
   /* бла-бла-блааа */
   $this->_object->$var = " VAR = $var;";
  }
}


class Base {
 var $load = null;
 function __construct()
 {
  $this->load = new Load($this); /* ????? */
 }
}

class News extends Base {

 function set()
 {
  $this->load->set_var('var1');
  $this->load->set_var('var2');
  $this->load->set_var('var3');
  $this->load->set_var('var4');
 }
 
 function view()
 {
  echo $this->var1;
  echo "\t";
  echo $this->var2;
 }

}

$news = new News();
$news->set();
$news->view();

echo $news->var1;

echo "<pre>";
var_dump($news);
echo "</pre>";
 

john.brown

просто кулибин
И что именно у тебя зацикливается? Что то не вижу, чтоб что то зацикливалось в этом примере. Другой вопрос, что не оч понятен смысл сей конструкции...
 

Савелей

Новичок
$this->load = new Load($this); /* ????? */

$this->_object = $object; /* ??????? */

$this->load -> $this->_object -> $this->load
вот тут зацикливание.
 

Савелей

Новичок
var_dump _object -> *RECURSION*

PHP:
object(News)#4 (5) {
  ["load"]=>
  object(Load)#5 (1) {
    ["_object"]=>
    object(News)#4 (5) {
      ["load"]=>
      object(Load)#5 (1) {
        ["_object"]=>
        *RECURSION*
      }
      ["var1"]=>
      string(12) " VAR = var1;"
      ["var2"]=>
      string(12) " VAR = var2;"
      ["var3"]=>
      string(12) " VAR = var3;"
      ["var4"]=>
      string(12) " VAR = var4;"
    }
  }
  ["var1"]=>
  string(12) " VAR = var1;"
  ["var2"]=>
  string(12) " VAR = var2;"
  ["var3"]=>
  string(12) " VAR = var3;"
  ["var4"]=>
  string(12) " VAR = var4;"
 

john.brown

просто кулибин
Да нету там никакого зацикливания. News->load содержит объект класса Load, а News->load->_object содержит ссылку на все тот же News. Такая конструкция, при определенных условиях может помешать работе сборщика мусора, но никаких других проблем не вижу. Токмо хорошо понимать, зачем такое делаеш.

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

john.brown

просто кулибин
Да в твоем примере вообще не понятна причина использования такой конструкции. Какое то масло масленное у тя там получается. Там все решается простым наследованием.
 

john.brown

просто кулибин
PHP:
class Load 
{   
  function set_var($var) 
    { 
   /* бла-бла-блааа */ 
   $this->$var = " VAR = $var;"; 
  } 
}
class News extends Load { 

 function set() 
 { 
  $this->set_var('var1'); 
  $this->set_var('var2'); 
  $this->set_var('var3'); 
  $this->set_var('var4'); 
 } 
  
 function view() 
 { 
  echo $this->var1; 
  echo "\t"; 
  echo $this->var2; 
 } 

} 

$news = new News(); 
$news->set(); 
$news->view(); 

echo $news->var1; 

echo "<pre>"; 
var_dump($news); 
echo "</pre>";
Base совершенно лишний :)
 

Савелей

Новичок
спасибо но мне это не подходит, так как base кучу всего еще делает в реале...

да и load содержит х...ву тучу методов которые перекроются из News
 

x-yuri

Новичок
Савелей, если тут и есть рекурсия, то в var_dump... а вообще у тебя циклические ссылки: $News->load ссылается на объект класса Load, $News->load->_object ссылается на $News... т.е. есть два объекта ($News и $News->load), и в обоих объектах есть ссылка на другой объект ($News->load и $News->load->_object соответственно). Хочешь, чтобы вывод var_dump был красивым, без слова RECURSION, не делай циклических ссылок

когда поймешь, спроси лучше, как организовать твою иерархию классов, а не как избавиться от слова RECURSION. Зачем в $News ссылка на объект класса Load? В объектах класса Load будет храниться какое-то состояние, специфичное для каждого отдельного объекта класса AppBase? Почему не сделать класс Load статическим? Зачем Load знать, как добавить в объект класса AppBase переменную? И как AppBase будет решать, что нужно подгрузить?
 
Сверху