Магический метод PHP __toString () не возвращает строку (РЕШЕНИЕ) - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть класс с именем FullName, и я использую магический метод PHP toString (), который должен возвращать строку, но я получаю объект напрямую:

<?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;

, возвращается "Mike Gen"

, но если я добавлю переменную $ name в массив:

$returnValues = array(
    'id' => $professional->id(),
    'name' => $name,
    'message' => 'The professional has been updated'
);

Возврат не ожидается, я получаю это:

{"id": "1", "name": {"forename": "Mike", "фамилия":" Gen "}," message ":" Профессионал обновлен "}

ИСПРАВЛЕНО благодаря @Nigel Ren, решению :

$returnValues = array(
    'id' => $professional->id(),
    'name' => (string) $name,
    'message' => 'The professional has been updated'
);

1 Ответ

0 голосов
/ 22 апреля 2019

__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 не приводят объект к строке.

Вот простая скрипка .

Идем дальше:

{"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 будет работать должным образом без явного приведения к строке - fiddle here .

...