type-tools-php

Форк
0
/
ObjectTypeCaster.php 
44 строки · 1.2 Кб
1
<?php
2

3
namespace Smoren\TypeTools;
4

5
use TypeError;
6

7
/**
8
 * Tool for casting types of objects.
9
 */
10
class 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
     */
20
    public static function cast(object $sourceObject, string $destinationClass)
21
    {
22
        if(!class_exists($destinationClass)) {
23
            throw 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
30
        if(!is_subclass_of($sourceClass, $destinationClass) && !is_subclass_of($destinationClass, $sourceClass)) {
31
            throw new TypeError("Classes '{$sourceClass}' and '{$destinationClass}' must be relatives");
32
        }
33

34
        /** @var string $serialized */
35
        $serialized = strstr(serialize($sourceObject), '"');
36

37
        return unserialize(sprintf(
38
            'O:%d:"%s"%s',
39
            strlen($destinationClass),
40
            $destinationClass,
41
            strstr($serialized, ':')
42
        ));
43
    }
44
}
45

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.