我有一个使用MYSQL和PHP创建OODB的类项目。
目前我的桌子上装满了对象框。我还有一个box类,当它被构造时,它将从表中提取数据,然后以类似的方式递归地构造它的子节点。这似乎运作良好。但是我无法通过子框调用函数。
这是班级:
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 :(得分: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()中的$ this-&gt; children。