【问题标题】:__toString() must return a string value__toString() 必须返回一个字符串值
【发布时间】:2012-12-17 23:06:30
【问题描述】:

谁能告诉我我做错了什么?这是我第一次使用 __toString。我收到以下错误:Catchable fatal error: Method users_class::__toString() must return a string value

这是我使用 Smarty 对对象的调用:

 {assign var='udatas' value="$userObj->fetchUser(array('id'=>$ststres[ststval].to_id))"}

这是对象。

class users_class {

protected $users_class;

public function __toString() {

    return $this->users_class;
}
  public function fetchUser(array $conditions){
            $db = Core::getInstance();

            $sql = "SELECT * FROM ".USERS." WHERE ";
            $i=0;
            $params = array();
            //$where = array();
            foreach ($conditions as $column => $value) {
            if (preg_match('/^[a-z-.-_]+$/', $column)) {
                if($i!=0){
                    $sql .= " AND ";
                }
            $sql .= "$column = ?";
            $params[] = $value;
            $i++;

    }
   }            
            //$sql .= implode(' AND ', $where);
            //$sql .= " order by title asc";    
            $res = $db->dbh->prepare($sql);
            $res->execute(array_values($params));
            return $res->fetch(PDO::FETCH_ASSOC);               
}   
   }

【问题讨论】:

  • 修复到protected $users_class = '';return (string)$this->users_class;
  • 这意味着您为变量$users_class设置的任何值都不是字符串。
  • users_class中应该存储什么类型的值?
  • 你为什么一开始就尝试实现__toString()
  • @Glavic 在合并您的建议后解决了错误,但该功能未返回所需的结果。我认为它只是抑制错误。

标签: php object tostring


【解决方案1】:

错误消息... must return a string value ... 只是意味着 __toString() 的返回值必须是数据类型字符串的值。如果您的示例中的 $users_class 不是字符串值,则必须在返回之前将其转换为字符串。

但是在阅读上面的示例时,在我看来 var $users_class 可能还没有被初始化。在这种情况下,将方法 __toString() 更改为:

public function __toString() {
    if(is_null($this->users_class)) {
        return 'NULL';
    }
    return $this->user_class;
}

要使上述代码正常工作,您还需要对 smarty 代码进行更改。删除 value= 属性值周围的双引号。

【讨论】:

  • 或者在__toString()方法中返回get_class($this)
  • @hek2mgl 在实施您的建议后,输出是这个 string(46) "->fetchUser(array('id'=>Array[ststval].to_id)) 而不是所需的输出。似乎它完成的唯一一件事就是抑制错误。您还有其他建议吗?
  • 您必须删除 smarty value= assignment 周围的双引号:{assign var='udatas' value=$userObj->fetchUser(array('id'=>$ststres[ststval].to_id))}
  • @hek2mgl 删除引号后我收到以下错误{assign var='udatas' value=$userObj->fetchUser(array('id'=>$ststres[ststval].to_id))}" - Unexpected "=>", expected one of: "","" , ")"
  • 这是一个聪明的语法问题,与这个问题的标题无关。我建议您为此打开一个单独的问题。
【解决方案2】:

只需替换为: return (string)$this->user_class;

【讨论】:

    【解决方案3】:

    您正在使用$res->fetch(PDO::FETCH_ASSOC),它将返回任何数组。 您正在将值作为标准对象访问。 您需要转换为一个类,您可以尝试使用PDO::FETCH_CLASS 而不是FETCH_ASSOC

    你所包含的代码很难说。

    【讨论】:

    • @Kevin 更改为 PDO::FETCH_CLASS 后收到以下错误Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: No fetch class specified
    • 您需要将类名 users_class 添加为 SQL 的第一列。所以那将是 SELECT 'users_class', * FROM。您也可以使用 FETCH_OBJ 但这会返回一个 StdClass 并且您不会调用 __toString 函数
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 2018-05-15
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多