Eloquent Model自动转换为JSON

时间:2017-07-15 19:01:23

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

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

use Illuminate\Database\Eloquent\Model;

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

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

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

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

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

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

这怎么可能?

1 个答案:

答案 0 :(得分:2)

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

PHP 7 Return type declarations州的文件(强调我的):

  

严格键入也会对返回类型声明产生影响。在默认的弱模式下,如果返回的值不属于该类型,则会将其强制转换为正确的类型。在强模式下,返回的值必须是正确的类型,否则将抛出TypeError。

__的toString()

如果在类中实现__toString()方法,则可以将其强制转换为具有字符串返回类型的字符串。

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

照亮\支持\ Collection.php

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

严格打字

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

declare(strict_types=1);

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