__toString不输出

__toString does not output

我找到条目 PHP OOP - toString 不工作,但它没有解决我的问题,因为我相信我正在正确调用魔法方法...

这是我的代码:

class Alerts {

    public $message;
    public $type;
    public $output;

    public function __construct($message_id)
    {
    include 'con.php';          
    $stmt = $conn->prepare(
    'SELECT * FROM alerts WHERE id = :message_id');
    $stmt->execute(array(':message_id' => $message_id));

    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        $this->type = $row['type'];
        $this->message = $row['message'];  
    }
    }

    public function __toString (){
        $output ='';
        $output .= "<div class='" . $this->type . "'><button class='close' data-dismiss='alert'></button>";
        $output .= "<i class='fa fa-check-circle'></i>&nbsp;<strong>";
        $output .= $this->message;
        $output .= "</strong> </div>";
        return $output;
     } 

}

如果我调用它就有效:

$message_id = 6;

$alert = new Alerts($message_id);
$output ='';
$output .= "<div class='" . $alert->type . "'><button class='close' data-dismiss='alert'></button>";
$output .= "<i class='fa fa-check-circle'></i>&nbsp;<strong>";
$output .= $alert->message;


$output .= "</strong> </div>";

在页面上,但如果我使用:

$message_id = 6;

$alert = new Alerts($message_id);
echo $alert->output;

我是 PHP OOP 的新手,非常感谢您的帮助

来自 the PHP docs:

The __toString() method allows a class to decide how it will react when it is treated like a string. For example, what echo $obj; will print. This method must return a string, as otherwise a fatal E_RECOVERABLE_ERROR level error is emitted.

按照这个逻辑,执行 echo $alert->output; 只会输出在 class 中声明的空白 属性 public $output;public $output 为空且未被修改的两个原因是:

  1. 您没有在 __toString() 方法的上下文中访问 $this->output
  2. 当您访问对象的任何方法或 属性 时,
  3. __toString() 不会被调用,当您将对象视为字符串时, 被调用。

如果您决定使用 __toString(),您实际应该做的是:

echo $alert;