PHP __toString()魔术方法不返回字符串(SOLUTION)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP __toString()魔术方法不返回字符串(SOLUTION)相关的知识,希望对你有一定的参考价值。
我有一个名为FullName的类,我正在使用toString()php魔术方法应该返回一个字符串,但我直接收到了Object:
<?php
declare(strict_types=1);
namespace AppProfessionalDomainValueObjects;
use AppProfessionalDomainExceptionsNameIsTooShortException;
final class FullName
{
public $forename;
public $surname;
public function __construct(string $forename, string $surname)
{
$this->forename = $this->validateAndNormalize($forename);
$this->surname = $this->validateAndNormalize($surname);
}
private function validateAndNormalize($name) : string
{
if (strlen($name) === 0) throw new NameIsTooShortException();
return ucwords($name);
}
public function __toString()
{
return $this->forename . ' ' . $this->surname;
}
}
当我尝试这个:
$name = new FullName($request->forename, $request->surname);
如果我使用:
echo $ name;
回报是“迈克根”
但是如果我在数组中添加$ name变量:
$returnValues = array(
'id' => $professional->id(),
'name' => $name,
'message' => 'The professional has been updated'
);
回报不是预期的,我收到这个:
{“id”:“1”,“name”:{“forename”:“Mike”,“surname”:“Gen”},“message”:“专业人士已更新”}
感谢@Nigel Ren,解决方案:
$returnValues = array(
'id' => $professional->id(),
'name' => (string) $name,
'message' => 'The professional has been updated'
);
答案
当您想要获取对象的字符串表示时,可以使用__toString
方法,例如,在调用echo $object
时隐式显示,或者在将对象转换为字符串或将其与另一个字符串连接时显式获取。在你的代码中
$name = new FullName($request->forename, $request->surname);
你创建一个新的FullName
对象并将其放入$name
变量。
要了解__toString
的工作原理,您需要将对象转换为字符串,例如:
echo $name;
// or
$str = 'The object as string is: ' . $name;
echo $str;
另请注意,var_dump
或print_r
不会将对象强制转换为字符串。
这是一个simple fiddle。
更进一步:
{"id":"1","name":{"forename":"Mike","surname":"Gen"},"message":"The professional has been updated"}
是一个json。 json_encode
不使用铸造字符串。
您要么明确地转换为字符串:
$returnValues = array(
'id' => $professional->id(),
'name' => (string)$name,
'message' => 'The professional has been updated'
);
或者实现JsonSerializable
:
final class FullName implements JsonSerializable
{
public function jsonSerialize()
{
return $this->forename . ' ' . $this->surname;
}
之后,编码到json将按预期工作,而无需显式转换为字符串 - 小提琴here。
以上是关于PHP __toString()魔术方法不返回字符串(SOLUTION)的主要内容,如果未能解决你的问题,请参考以下文章