PHP __toString()魔术方法不返回字符串(SOLUTION)

问题描述 投票:-1回答:1

我有一个名为FullName的类,我正在使用toString()PHP魔术方法应该返回一个字符串,但我直接收到了Object:

<?php

declare(strict_types=1);

namespace App\Professional\Domain\ValueObjects;

use App\Professional\Domain\Exceptions\NameIsTooShortException;

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'
);
php tostring
1个回答
0
投票

当您想要获取对象的字符串表示时,可以使用__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

© www.soinside.com 2019 - 2024. All rights reserved.