【问题标题】:Eloquent Model is automatically converted to JSONEloquent 模型自动转换为 JSON
【发布时间】:2017-07-15 19:01:22
【问题描述】:

我有一个非常简单的 Eloquent 模型,名为 Player。像这样的:

use Illuminate\Database\Eloquent\Model;

class Player extends Model
{
    protected $table = 'players';
}

我在我的控制器中创建了一个函数,它应该将所有玩家作为 JSON 字符串返回。

private function getPlayers(): string
{
    $players = Player::get();
    return $players;
}

我后来意识到我忘了对$players变量进行json_encode,但显然没关系,因为它仍然返回json。

private function getPlayers(): string 
{
    $players = Player::get();
    echo gettype($players); //object
    return $players;
}

public function getPlayersType()
{
    $players = $this->getPlayers();
    echo gettype($players); //string
}

这怎么可能?

【问题讨论】:

    标签: php laravel eloquent php-7 return-type


    【解决方案1】:

    答案在string 返回类型声明中。

    PHP 7 Return type declarations 状态的文档(强调我的):

    严格类型也会对​​返回类型声明产生影响。在默认的弱模式下,返回的值将被强制转换为正确的类型,如果它们还不是该类型的话。 strong模式下,返回值必须是正确的类型,否则会抛出TypeError。

    __toString()

    如果你在一个类中实现了__toString()方法,它可以被强制转换为一个字符串返回类型的字符串。

    在这种情况下,Player::get() 返回一个 Collection 类的实例,它实现了一个 __toString() 方法,该方法对集合进行 json 编码

    Illuminate\Support\Collection.php

    /**
     * Convert the collection to its string representation.
     *
     * @return string
     */
    public function __toString()
    {
        return $this->toJson();
    }
    

    严格输入

    要禁用此功能,您必须通过在代码中添加严格的类型声明来启用 Strict typing

    declare(strict_types=1);
    

    请注意,这也会强制对函数参数的类型提示进行严格键入。

    【讨论】:

    • 很好的答案,很好的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2022-06-16
    相关资源
    最近更新 更多