type-tools-php
44 строки · 1.2 Кб
1<?php
2
3namespace Smoren\TypeTools;
4
5use TypeError;
6
7/**
8* Tool for casting types of objects.
9*/
10class ObjectTypeCaster
11{
12/**
13* Cast object to another relative type (upcast or downcast).
14*
15* @param object $sourceObject
16* @param class-string $destinationClass
17*
18* @return mixed
19*/
20public static function cast(object $sourceObject, string $destinationClass)
21{
22if(!class_exists($destinationClass)) {
23throw new TypeError("Class '{$destinationClass}' does not exist");
24}
25
26$sourceClass = get_class($sourceObject);
27
28// Unfortunately PHPstan has a problem with function is_subclass_of(). So:
29// @phpstan-ignore-next-line
30if(!is_subclass_of($sourceClass, $destinationClass) && !is_subclass_of($destinationClass, $sourceClass)) {
31throw new TypeError("Classes '{$sourceClass}' and '{$destinationClass}' must be relatives");
32}
33
34/** @var string $serialized */
35$serialized = strstr(serialize($sourceObject), '"');
36
37return unserialize(sprintf(
38'O:%d:"%s"%s',
39strlen($destinationClass),
40$destinationClass,
41strstr($serialized, ':')
42));
43}
44}
45