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_dumpprint_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)的主要内容,如果未能解决你的问题,请参考以下文章

PHP常用魔术方法(__toString魔术方法)

php类知识---魔术方法__toString,__call,__debugInfo

__tostring()和__invoke()的用法

php面向对象之__toString()

php魔术方法__tostring的应用

php魔术方法__tostring