从类打印或返回输出和从函数打印之间的区别是什么

时间:2013-08-26 05:31:31

标签: php mysql object printing tostring

我创建了一个类,它从mySQL查询中获取输出并对其进行格式化并返回它。

这是班级:

<?php 
class sql_output_two_rows extends sql {

    function __construct($sql) {
        $this->sql = $sql;
        $this->output = "";
        parent::__construct($this->sql);
        $this->output .=  "<table class='tablenarrow bordered'>\n";
        $this->output .= "<tr>\n";
        for ($f = 0; $f < $this->num_fields; $f++) {
            if($f%($this->num_fields/2) == 0){
                $this->output .=  "<tr>\n";
            }
            if($f>0 && $f%($this->num_fields/2) != (($this->num_fields/2) - 1) || $f == ($this->num_fields - 1)){
                $this->output .= "<th style='border-radius:0px;'>".$this->field_name[$f]."</th>\n";
            }else{
                $this->output .= "<th>".$this->field_name[$f]."</th>\n";
            }
            if($f%($this->num_fields/2) == (($this->num_fields/2) - 1) ){
                $this->output .=  "</tr>\n";
            }
        }
        $this->output .="</tr>\n";
        for ($r = 0; $r < $this->num_rows; $r++) {
            for ($f = 0; $f < $this->num_fields; $f++) {
                if($f%($this->num_fields/2) == 0){
                    $this->output .=  "<tr style='background:#dbe1ef;'>\n";
                }
                $this->output .= "<td>\n";
                if($this->row_array[$r][$f] == ""){
                    $this->row_array[$r][$f]="&nbsp;";
                }
                $this->output .= $this->row_array[$r][$f];
                $this->output .= "</td>\n";
                if($f%($this->num_fields/2) == (($this->num_fields/2) - 1) ){
                    $this->output .=  "</tr>\n";
                }
            }
            $this->output .=  "<tr>\n";
            $this->output .= "<td colspan = '".($this->num_fields/2)."'>\n";
            $this->output .= "<hr>\n";
            $this->output .= "</td>\n";
            $this->output .=  "</tr>\n";
        }
        $this->output .= "</table>\n";
        // print $this->output;
        return($this->output);
    }
}
?>

注意班级的最后两行。

我已注释掉打印输出的行。如果我取消注释该行,那么我就这样调用该类:

new sql_output_two_rows("select * from accounts limit 10");

打印得很好。

但是,如果我保持原样,并按此调用它:

$output = new sql_output_two_rows("select * from cameron.accounts limit 10");

print $output . "\n";

然后我收到以下错误:

Object of class sql_output_two_rows could not be converted to string

为了解决这个问题,我必须将这个功能添加到类中:

 public function __toString(){

    return $this->output;

}

我的问题是:发生了什么事情 - 即当我从班级打印时 - 而另一个不打算 - 即当我返回输出时。

我希望我足够清楚。

2 个答案:

答案 0 :(得分:1)

而不是打印$output你应该打印$output->output另一种语义方式来写这个:

$sqlOutput = new sql_output_two_rows("select * from accounts limit 10");
print $sqlOuput->output;

这是有效的原因是因为,正如当前所写的那样,$ output包含对对象 sql-ouput_two_rows的引用,其中属性为$ output。在PHP中,您可以使用 - &gt;访问对象属性。箭头。即:$output->output

答案 1 :(得分:0)

构造函数不能返回值。它们总是返回创建的对象。因此,您将获得$output创建的class sql_output_two_rows对象,而不是字符串。重构代码(可能是用于格式化的静态函数或为其创建额外函数)