如何在PHP7中使用返回类型a类 我试过下面的代码。但在本例中,当发生错误时,我返回一个空白对象

如何在PHP7中使用返回类型a类 我试过下面的代码。但在本例中,当发生错误时,我返回一个空白对象,php,Php,是否可以写入返回空白对象?当返回类型为class时 public static function createBook($book_data): BookModel { try { $book = new BookModel; $book->fill($book_data); $book->save(); return $book; } catch(\Exception $e) {

是否可以写入返回空白对象?当返回类型为class时

public static function createBook($book_data): BookModel
{
    try {
        $book = new BookModel;
        $book->fill($book_data);
        $book->save();
        return $book;
    }
    catch(\Exception $e) {
       log::error($e->getMessage());
       $book = new BookModel;
       return $book;
    }
}

我认为这取决于(在本例中)抛出异常时要执行的操作

  • 如果你想让应用程序知道出了什么问题,你应该返回
    false
    。返回一个空的
    BookModel
    基本上就是说一切都很顺利,检查某个对象的属性是否为空要比检查该对象的属性是否为空容易得多
  • 如果它真的不介意书是空的(也就是说,你的代码并不认为书总是满的),我认为返回一本空的书是可以的。不过,我会稍微更改代码:

    public static function createBook($book_data): BookModel
    {
        $book = new BookModel();
        try {
            $book->fill($book_data);
            $book->save();
        }
        catch(\Exception $e) {
            log::error($e->getMessage());
        }
        return $book;
    }
    

如果返回空对象,您会感到痛苦:

  • 若您使用数据库的自动增量ID,那个么它就不会存在于这个空模型上
  • 不填写任何其他必填字段。(例如,没有作者和内容的书?)
虽然在某些情况下,空状态对象是可以的,但如果必须询问,则很可能会错误地处理它

因为您必须检查这个空对象,所以返回null仍然是一个不错的解决方案。如果您使用的是php7.1,那么返回类型可以保留(注意问号)

在我看来,更好的方法是允许错误向上传播,并让您在其他地方捕获它。看起来您正在使用laravel,因此无论如何都会记录错误。因此,例如,如果您在数据库事务中,事务可以安全地失败:

public static function createBook($book_data): BookModel
{
    $book = new BookModel;
    $book->fill($book_data);
    $book->save();

    return $book;
}

当然可以。您的
BookModel
是该类的有效对象,无论是否已填充。现在,如果您假定对象已“填充”,那么您自己的代码可能会在该对象上绊倒。但这不是泛语言的问题,而是您的实现不够健壮。IMHO-在本例中返回对象的实例是不正确的。调用例程如何知道是否创建了图书?对于其他程序员来说,假设他有一本书的实例,一切都正常工作是很容易的。例外情况是否重要——是否应该向上传递——取决于你的应用程序是如何构建的。
public static function createBook($book_data): BookModel
{
    $book = new BookModel;
    $book->fill($book_data);
    $book->save();

    return $book;
}