Passed
Push — master ( bae7fb...bdda0d )
by Sebastian
03:37
created

ConvertHelper_Comparator   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 10
eloc 18
c 1
b 0
f 0
dl 0
loc 84
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A areVariablesEqual() 0 6 1
A areStringsEqual() 0 3 1
B convertScalarForComparison() 0 23 7
A areNumbersEqual() 0 3 1
1
<?php
2
/**
3
 * File containing the {@see \AppUtils\ConvertHelper_Comparator} class.
4
 *
5
 * @package Application Utils
6
 * @subpackage ConvertHelper
7
 * @see \AppUtils\ConvertHelper_Comparator
8
 */
9
10
declare(strict_types=1);
11
12
namespace AppUtils;
13
14
/**
15
 * Comparison helper for different variable types.
16
 *
17
 * @package Application Utils
18
 * @subpackage ConvertHelper
19
 * @author Sebastian Mordziol <[email protected]>
20
 */
21
class ConvertHelper_Comparator
22
{
23
    /**
24
     * Checks whether the specified variables are equal (exact type check by default).
25
     *
26
     * @param mixed $a
27
     * @param mixed $b
28
     * @return bool
29
     *
30
     * @throws ConvertHelper_Exception
31
     * @see ConvertHelper::ERROR_CANNOT_NORMALIZE_NON_SCALAR_VALUE
32
     */
33
    public static function areVariablesEqual($a, $b) : bool
34
    {
35
        $a = self::convertScalarForComparison($a);
36
        $b = self::convertScalarForComparison($b);
37
38
        return $a === $b;
39
    }
40
41
    /**
42
     * Converts any scalar value to a string for comparison purposes.
43
     *
44
     * @param mixed|null $scalar
45
     * @return string|null
46
     *
47
     * @throws ConvertHelper_Exception
48
     * @see ConvertHelper::ERROR_CANNOT_NORMALIZE_NON_SCALAR_VALUE
49
     */
50
    protected static function convertScalarForComparison($scalar) : ?string
51
    {
52
        if($scalar === '' || is_null($scalar)) {
53
            return null;
54
        }
55
56
        if(is_bool($scalar)) {
57
            return ConvertHelper_Bool::toStringStrict($scalar);
58
        }
59
60
        if(is_array($scalar)) {
61
            $scalar = md5(serialize($scalar));
62
        }
63
64
        if($scalar !== null && !is_scalar($scalar)) {
65
            throw new ConvertHelper_Exception(
66
                'Not a scalar value in comparison',
67
                null,
68
                ConvertHelper::ERROR_CANNOT_NORMALIZE_NON_SCALAR_VALUE
69
            );
70
        }
71
72
        return strval($scalar);
73
    }
74
75
    /**
76
     * Compares two strings to check whether they are equal.
77
     * null and empty strings are considered equal.
78
     *
79
     * @param string|NULL $a
80
     * @param string|NULL $b
81
     * @return boolean
82
     *
83
     * @throws ConvertHelper_Exception
84
     * @see ConvertHelper::ERROR_CANNOT_NORMALIZE_NON_SCALAR_VALUE
85
     */
86
    public static function areStringsEqual(?string $a, ?string $b) : bool
87
    {
88
        return self::areVariablesEqual($a, $b);
89
    }
90
91
    /**
92
     * Checks whether the two specified numbers are equal.
93
     * null and empty strings are considered as 0 values.
94
     *
95
     * @param number|string|NULL $a
96
     * @param number|string|NULL $b
97
     * @return boolean
98
     *
99
     * @throws ConvertHelper_Exception
100
     * @see ConvertHelper::ERROR_CANNOT_NORMALIZE_NON_SCALAR_VALUE
101
     */
102
    public static function areNumbersEqual($a, $b) : bool
103
    {
104
        return self::areVariablesEqual($a, $b);
105
    }
106
}
107