2013-05-07 2 views
0

У меня есть проект класса, создающий OODB с MYSQL и PHP.PHP - вызывающий объект в объекте

В настоящее время у меня есть стол, заполненный предметными коробками. У меня также есть класс ящиков, который, когда он будет построен, вытащит его из таблицы, а затем рекурсивно построит его дочерние элементы аналогичным образом. Кажется, это хорошо работает. Но я не могу вызвать функцию из дочернего окна.

Вот класс:

class Box1 { 
    var $id; 
    var $pid; 
    var $children; 
    var $type; 
    var $content; 
    var $siblingorder; 

    function Box1($bId){ 

     $q ="SELECT * FROM `box` WHERE id =". $bId; 
     $r = mysql_query($q); 
     if ($r){ 
       $row = mysql_fetch_array($r); 
       $this->id=$bId; 
       $this->pid=$row[1]; 
       $this->children=$row[2]; 
       $this->type=$row[3]; 
       $this->siblingorder=$row[5]; 
       $this->content=$row[6]; 
       //echo $this->id."<br />"; 
       if(isset($this->children)){ 
       //echo $this->children."<br />"; 
       $kids = explode(',', $this->children); 
       foreach ($kids as $key => $value) { 
        $varname = "box".$value; 
        //global $$varname; 
        //echo $varname."<br>"; 
        $$varname = new Box1($value); 
       } 
      } 
     } 
    }//constructor 

    function display(){ 
     echo "<div style='border: solid 2px;'>"; 
     echo $this->id; 
     echo "<br />"; 
     if(isset($this->children)){ 
      $kids = explode(',', $this->children); 
     foreach ($kids as $key => $value) { 
       $varname = "box".$value; 
       //echo $varname."<br />"; 
       $$varname->display(); 
     } 
     } 
     echo "</div>"; 
    }//End DISPLAY 

    function update(){ 

    }//End UPDATE 

} 

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

$box1 = new Box1(1); 
    $box1->display(); 

Любая помощь или представление будет будем очень благодарны.

+0

Это проблема с переменной областью. 'display()' не может получить доступ к '$ box1', потому что это не входит в объем этой функции. Я бы, вероятно, создал массив дочерних объектов как атрибут объекта. – andrewsi

ответ

0

Как указано в первом комментарии, проблема состоит в том, что в конструкторе создается и назначается $$ varname. Но это не существует на дисплее функции. После вызова конструктора эти переменные больше не существуют. Найти код ниже, который показывает вам, как сделать детей массив объектов типа Box1

class Box1 { 

    var $id; 
    var $pid; 
    var $children; 
    var $type; 
    var $content; 
    var $siblingorder; 

    function Box1($bId){ 

     $q ="SELECT * FROM `box` WHERE id =". $bId; 
     $r = mysql_query($q); 
     if ($r){ 
       $row = mysql_fetch_array($r); 
       $this->id=$bId; 
       $this->pid=$row[1]; 
       $this->children = array();//[*] 
       $this->type=$row[3]; 
       $this->siblingorder=$row[5]; 
       $this->content=$row[6]; 

       //now we fill this->children with objects of type Box1 
       if ($row[2] != '') { 
        $kids = explode(',', $row[2]); 
        foreach ($kids as $value) { 
         $this->children[] = new Box1($value); 
        } 
       } 
     } 
    }//constructor 

    function display(){ 
     echo "<div style='border: solid 2px;'>"; 
     echo $this->id; 
     echo "<br />"; 
     foreach ($this->chidren as $kid) { 
       $kid->display(); 
     } 
     echo "</div>"; 
    }//End DISPLAY 

    function update(){ 

    }//End UPDATE 

} 

[*]: Здесь мы решили, что дети всегда массив Box1. Конечно, этот массив может быть пустым, если детей нет. Это вопрос вкуса, некоторые люди предпочтут ему отказаться, если не будут дети. Но в этом случае вам нужно будет проверить нулевое значение, прежде чем вы перейдете к $ this-> children в display().

+0

После некоторых очень небольших настроек, таких как добавление l в -> chidren, это сработало. Пятно на вас большое спасибо. – user2359107

Смежные вопросы