Na kilka różnych sposobów te same dane? Hmm...
<?php
class Foo // czyli Twój stdClass, mozesz sobie stworzyć własną klasę zamiast używac stdClass
{
private $someStr;
public function __construct(string $someStr)
{
$this->someStr = $someStr;
}
public function getSomeStr(): string
{
return $this->someStr;
}
}
class UppercaseRepresentationOfFoo implements \JsonSerializable
{
private $foo;
public function __construct(Foo $foo)
{
$this->foo = $foo;
}
public function jsonSerialize(): array
{
return [
'someStr' => strtoupper($this->foo->getSomeStr()),
];
}
}
class LowercaseRepresentationOfFoo implements \JsonSerializable
{
private $foo;
public function __construct(Foo $foo)
{
$this->foo = $foo;
}
public function jsonSerialize(): array
{
return [
'someStr' => strtolower($this->foo->getSomeStr()),
];
}
}
class FooTransformer
{
public const UPPERCASE = 'uppercase';
public const LOWERCASE = 'lowercase';
public static function transform(Foo $foo, string $type): \JsonSerializable
{
switch ($type)
{
case self::UPPERCASE:
return new UppercaseRepresentationOfFoo($foo);
case self::LOWERCASE:
return new LowercaseRepresentationOfFoo($foo);
default:
throw new \InvalidArgumentException(sprintf('Nieznany typ %s', $type));
}
}
}
$foo = new Foo('testowy string');
$uppercaseRepresentation = FooTransformer::transform($foo, FooTransformer::UPPERCASE);
$lowercaseRepresentation = FooTransformer::transform($foo, FooTransformer::LOWERCASE);
echo json_encode($uppercaseRepresentation); // {"someStr":"TESTOWY STRING"}
echo json_encode($lowercaseRepresentation); // {"someStr":"testowy string"}