Completed
Push — master ( f30a66...783f1c )
by Matthew
08:20 queued 39s
created

Util::copyProperties()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 4.8437

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 5
cts 8
cp 0.625
rs 9.2
c 0
b 0
f 0
cc 4
eloc 7
nc 3
nop 3
crap 4.8437
1
<?php
2
3
namespace Dtc\QueueBundle\Util;
4
5
class Util
6
{
7
    /**
8
     * Copies the members of obj1 that have public getters to obj2 if there exists a public setter in obj2 of the same suffix, it will also copy public variables.
9
     *
10
     * @param object $obj1
11
     * @param object $obj2
12
     */
13 28
    public static function copy($obj1, $obj2)
14
    {
15 28
        if (!is_object($obj1)) {
16
            throw new \Exception('$obj1 must be an object, not '.gettype($obj1));
17
        }
18 28
        if (!is_object($obj2)) {
19
            throw new \Exception('$obj2 must be an object, not '.gettype($obj2));
20
        }
21 28
        $reflection1 = new \ReflectionObject($obj1);
22 28
        $reflection2 = new \ReflectionObject($obj2);
23 28
        self::copyMethods([$obj1, $obj2], $reflection1, $reflection2);
24 28
        self::copyProperties([$obj1, $obj2], $reflection1, $reflection2);
25 28
    }
26
27
    /**
28
     * @param array[object, object] $payload
29
     * @param \ReflectionObject     $reflection1
30
     * @param \ReflectionObject     $reflection2
31
     */
32 28
    private static function copyProperties(array $payload, \ReflectionObject $reflection1, \ReflectionObject $reflection2)
33
    {
34 28
        list($obj1, $obj2) = $payload;
35 28
        $publicVars = $reflection1->getProperties(\ReflectionProperty::IS_PUBLIC);
36 28
        foreach ($publicVars as $property) {
37
            $propertyName = $property->getName();
38
            if ($reflection2->hasProperty($propertyName) && $reflection2->getProperty($propertyName)->isPublic()) {
39
                $obj2->$propertyName = $obj1->$propertyName;
40
            }
41
        }
42 28
    }
43
44
    /**
45
     * @param array[object, object] $payload
46
     * @param \ReflectionObject     $reflection1
47
     * @param \ReflectionObject     $reflection2
48
     */
49 28
    private static function copyMethods(array $payload, \ReflectionObject $reflection1, \ReflectionObject $reflection2)
50
    {
51 28
        list($obj1, $obj2) = $payload;
52 28
        $methods = $reflection1->getMethods(\ReflectionMethod::IS_PUBLIC);
53 28
        foreach ($methods as $method) {
54 28
            $methodName = $method->name;
55 28
            if (0 === strpos($methodName, 'get')) {
56 28
                $getMethod = $methodName;
57 28
                $setMethod = $methodName;
58 28
                $setMethod[0] = 's';
59 28
                self::copyMethod([$obj1, $obj2], $getMethod, $setMethod, $reflection2);
0 ignored issues
show
Documentation introduced by
$setMethod is of type array<integer,string,{"0":"string"}>, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
60
            }
61
        }
62 28
    }
63
64
    /**
65
     * @param array[object, object] $payload
66
     * @param string                $getMethod
67
     * @param string                $setMethod
68
     * @param \ReflectionObject     $reflection2
69
     */
70 28
    private static function copyMethod(array $payload, $getMethod, $setMethod, \ReflectionObject $reflection2)
71
    {
72 28
        list($obj1, $obj2) = $payload;
73 28
        if ($reflection2->hasMethod($setMethod)) {
74 28
            $value = $obj1->$getMethod();
75 28
            if (null !== $value) {
76 28
                $obj2->$setMethod($value);
77
            }
78
        }
79 28
    }
80
81
    /**
82
     * @param string $varName
83
     * @param int    $var
84
     * @param int    $pow
85
     */
86 4
    public static function validateIntNull($varName, $var, $pow)
87
    {
88 4
        if (null === $var) {
89 4
            return null;
90
        }
91 4
        if (!ctype_digit(strval($var))) {
92 1
            throw new \Exception("$varName must be an integer");
93
        }
94
95 4
        if (strval(intval($var)) !== strval($var) || $var <= 0 || $var >= pow(2, $pow)) {
96 3
            throw new \Exception("$varName must be an base 10 integer within 2^$pow");
97
        }
98
99 4
        return intval($var);
100
    }
101
}
102