Php 可捕获致命错误:类作者的对象无法转换为字符串

Php 可捕获致命错误:类作者的对象无法转换为字符串,php,class,oop,Php,Class,Oop,我在学OOP。我有一个数据库类,作者类和一个问题类。我想要的是将用户输入放到适当的类中,连接到数据库并插入类中的数据 // ask.php $pdo = new DbConnect('host', 'dbname', 'username', 'password'); // Create an Author object try { $author = new Author($first_name, $last_name); } cat

我在学OOP。我有一个数据库类,作者类和一个问题类。我想要的是将用户输入放到适当的类中,连接到数据库并插入类中的数据

    // ask.php

    $pdo = new DbConnect('host', 'dbname', 'username', 'password');

    // Create an Author object

    try {
        $author = new Author($first_name, $last_name);
    } catch (Exception $e) {
        echo $e->getMessage();
    }

    // Question object

    try {
        $question = new Question($author, $author_question);
    } catch (Exception $e) {
        echo $e->getMessage(), '<br>';
    }

    // Insert the user input into the database

    $pdo->execute_query('INSERT INTO author (first_name, last_name) VALUES (?, ?)', array($author->getFirstName(), $author->getLastName()));
    $pdo->execute_query('INSERT INTO question (author, question) VALUES (?, ?)', array($question->getAuthor(), $question->getQuestion()));
    $pdo->close_connection();

    // class.dbconnect.php

    public function execute_query($sql, array $data = null)
    {
        $this->stmt = $this->conn->prepare($sql);

        if (!$this->stmt->execute($data)) {
            throw new Exception('Error with your query.');
        }
    }

    // class.question.php

    class Question
    {
        private $author;
        private $question;

        public function __construct(Author $author, $question)
        {
            $this->author = $author;
            $this->question = $question;
        }

        public function getAuthor()
        {
            return $this->author;
        }

        public function getQuestion()
        {
            return ucfirst($this->question);
        }
    }
//ask.php
$pdo=new DbConnect('host','dbname','username','password');
//创建一个Author对象
试一试{
$author=新作者($first\u name,$last\u name);
}捕获(例外$e){
echo$e->getMessage();
}
//问题对象
试一试{
$question=新问题($author,$author\u question);
}捕获(例外$e){
echo$e->getMessage(),“
”; } //将用户输入插入数据库 $pdo->execute_query('插入到author(first_name,last_name)值(?,)',数组($author->getFirstName(),$author->getLastName()); $pdo->execute_query('INSERT-INTO-question(author,question)值(?,)',数组($question->getAuthor(),$question->getQuestion()); $pdo->关闭_连接(); //class.dbconnect.php 公共函数执行查询($sql,数组$data=null) { $this->stmt=$this->conn->prepare($sql); 如果(!$this->stmt->execute($data)){ 抛出新异常('查询出错'); } } //class.question.php 课堂提问 { 私人作家; 私人问题; 公共函数构造(Author$Author$question) { $this->author=$author; $this->question=$question; } 公共函数getAuthor() { 返回$this->author; } 公共函数getQuestion() { 首先返回($this->question); } }
虽然没有显示这些类,但我的猜测是:

    $question = new Question($author, $author_question);
问题
类构造函数使用$author a
字符串
,这是第一个参数,您试图传递整个对象。根据您的逻辑/内部功能,您可以通过传递作者的id/姓名或将该参数用作
Question
类中的对象来修复此问题

**更新**

现在这些类都可用了,在查询中调用
$question->getAuthor()
,它返回一个对象,而不是作者姓名或id

您可以将
Author
类修复为:

    public function getAuthor()
    {
        return $this->author->getFirstName() . " " . $this->author->getLastName()  // to return author's full name as a string!            
    }

或类似的函数,以便根据您的逻辑将值设置为和整数或字符串。我会使用作者的自动递增ID,因为您实际上是在尝试创建两个对象之间的关系。

您的问题是,当您调用
$question->getAuthor
时,它返回的是一个对象,而不是字符串:

    public function __construct(Author $author, $question)
    {
        $this->author = $author;  // this is an object
        $this->question = $question;
    }

    public function getAuthor()
    {
        return $this->author;     // this is an object
    }

在数据库查询中使用
$question->getAuthor()
时,需要返回一个字符串。我建议您添加某种类型的
getAuthorName
方法来提问,或者返回author对象,然后调用
$author->getFirstName
$author->getLastName
,以获取您需要的作者姓名格式。

错误在哪里?你也可以发布你的类的精简版本吗?@我警告外星人错误发生在我在class.dbconnect.php中创建的insert查询方法中。什么是
$question->getAuthor()
do?我猜它会返回一个
Author
对象,而不是字符串。你是对的。我不能把它插入数据库?我在帖子中包含了来自question类的代码。不——你不能像那样将对象放入db查询中。除此之外,如何将对象表示为文本字符串?!?!PHP不知道,数据库不知道,我不知道……在问题构造函数中,我指定了第一个参数来接受author对象。我更新了我的帖子,并加入了问题类。“返回$this->author->$author->getFirstName()”那个$author在那里,有必要吗?不,这是一个打字错误,这样不行。现在修复了,但是你明白了,当你需要将对象作为字符串传递而不是传递对象时,你应该得到对象的一些属性。好的,我接受了你的答案,谢谢。好奇的是,你有没有其他方法将对象转换成字符串?(字符串)不起作用。_uuu-toString()如何,在这种情况下适用吗?确切地说,使用
uuu-toString()
时,无论何时尝试
回送
或将对象强制转换为
字符串
,都将返回对象
字符串
表示,而不是实际对象。