Completed
Push — master ( 8a247e...4109b7 )
by Matthew
05:12
created

Util::copyMethod()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 7
cts 7
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 6
nc 3
nop 4
crap 3
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 20
    public static function copy($obj1, $obj2)
14
    {
15 20
        if (!is_object($obj1)) {
16
            throw new \InvalidArgumentException('$obj1 must be an object, not '.gettype($obj1));
17
        }
18 20
        if (!is_object($obj2)) {
19
            throw new \InvalidArgumentException('$obj2 must be an object, not '.gettype($obj2));
20
        }
21 20
        $reflection1 = new \ReflectionObject($obj1);
22 20
        $reflection2 = new \ReflectionObject($obj2);
23 20
        self::copyMethods([$obj1, $obj2], $reflection1, $reflection2);
24 20
        self::copyProperties([$obj1, $obj2], $reflection1, $reflection2);
25 20
    }
26
27
    /**
28
     * @param array[object, object] $payload
29
     * @param \ReflectionObject     $reflection1
30
     * @param \ReflectionObject     $reflection2
31
     */
32 20
    private static function copyProperties(array $payload, \ReflectionObject $reflection1, \ReflectionObject $reflection2)
33
    {
34 20
        list($obj1, $obj2) = $payload;
35 20
        $publicVars = $reflection1->getProperties(\ReflectionProperty::IS_PUBLIC);
36 20
        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 20
    }
43
44
    /**
45
     * @param array[object, object] $payload
46
     * @param \ReflectionObject     $reflection1
47
     * @param \ReflectionObject     $reflection2
48
     */
49 20
    private static function copyMethods(array $payload, \ReflectionObject $reflection1, \ReflectionObject $reflection2)
50
    {
51 20
        list($obj1, $obj2) = $payload;
52 20
        $methods = $reflection1->getMethods(\ReflectionMethod::IS_PUBLIC);
53 20
        foreach ($methods as $method) {
54 20
            $methodName = $method->name;
55 20
            if (0 === strpos($methodName, 'get')) {
56 20
                $getMethod = $methodName;
57 20
                $setMethod = $methodName;
58 20
                $setMethod[0] = 's';
59 20
                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 20
    }
63
64
    /**
65
     * @param array[object, object] $payload
66
     * @param string                $getMethod
67
     * @param string                $setMethod
68
     * @param \ReflectionObject     $reflection2
69
     */
70 20
    private static function copyMethod(array $payload, $getMethod, $setMethod, \ReflectionObject $reflection2)
71
    {
72 20
        list($obj1, $obj2) = $payload;
73 20
        if ($reflection2->hasMethod($setMethod)) {
74 20
            $value = $obj1->$getMethod();
75 20
            if (null !== $value) {
76 20
                $obj2->$setMethod($value);
77
            }
78
        }
79 20
    }
80
81
    /**
82
     * @param string $varName
83
     * @param int    $var
84
     * @param int    $pow
85
     */
86 1
    public static function validateIntNull($varName, $var, $pow)
87
    {
88 1
        if (null === $var) {
89 1
            return null;
90
        }
91 1
        if (!ctype_digit(strval($var))) {
92
            throw new \InvalidArgumentException("$varName must be an integer");
93
        }
94
95 1
        if (strval(intval($var)) !== strval($var) || $var <= 0 || $var >= pow(2, $pow)) {
96 1
            throw new \InvalidArgumentException("$varName must be an base 10 integer within 2^$pow");
97
        }
98
99 1
        return intval($var);
100
    }
101
}
102