2013-05-07 3 views
0

MYSQL 및 PHP로 OODB를 만드는 클래스 프로젝트가 있습니다.PHP - 개체에서 개체 호출

현재 개체 상자로 채워진 표가 있습니다. 또한 생성 될 때 테이블에서 데이터를 가져온 다음 비슷한 방식으로 자식을 재귀 적으로 생성하는 box 클래스가 있습니다. 그것은 잘 작동하는 것 같습니다. 하지만 자식 상자에서 함수를 호출 할 수 없습니다. 것

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

어떤 도움이나 통찰력 : 여기

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 

} 

생성자와 차례로 어린이 상자 표시 기능을 호출해야 표시 함수를 호출하는 코드입니다 : 여기

는 클래스입니다 많이 감사하겠습니다.

+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의 배열임을 결정한다. 물론 자식 배열이 없으면이 배열은 비어있을 수 있습니다. 미각의 문제이지만, 어린이가 없으면 어떤 사람들은 그것을 null로 보냅니다. 그러나이 경우 display()에서 $ this-> children을 반복하기 전에 null 값을 확인해야합니다.

+0

-> chidren을 추가하는 것과 같은 아주 미세한 조정을 한 후에 효과가있었습니다. 스팟에 고마워요. – user2359107

관련 문제