我有一个名为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
}
这怎么可能?
答案 0 :(得分:2)
答案在string
返回类型声明中。
PHP 7 Return type declarations州的文件(强调我的):
严格键入也会对返回类型声明产生影响。在默认的弱模式下,如果返回的值不属于该类型,则会将其强制转换为正确的类型。在强模式下,返回的值必须是正确的类型,否则将抛出TypeError。
如果在类中实现__toString()
方法,则可以将其强制转换为具有字符串返回类型的字符串。
在这种情况下,Player::get()
返回Collection
类的实例,该实现实现了json对集合进行编码的__toString()
方法
/**
* Convert the collection to its string representation.
*
* @return string
*/
public function __toString()
{
return $this->toJson();
}
要禁用此功能,您必须通过在代码中添加严格类型声明来启用Strict typing
declare(strict_types=1);
请注意,这也会对函数参数的类型提示强制执行严格的输入。