FunctionRegistry   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 17
c 0
b 0
f 0
dl 0
loc 78
rs 10
wmc 8

4 Methods

Rating   Name   Duplication   Size   Complexity  
A reset() 0 6 3
A set() 0 4 1
A get() 0 8 2
A evaluate() 0 11 2
1
<?php
2
namespace Chadicus;
3
4
/**
5
 * This class if for overriding global functions for use within unit tests.
6
 */
7
final class FunctionRegistry
8
{
9
    /**
10
     * Array of custom functions.
11
     *
12
     * @var callable[]
13
     */
14
    private static $functions = array();
15
16
    /**
17
     * Register a new function for testing.
18
     *
19
     * @param string   $namespace The namespace from which the global function will be called.
20
     * @param string   $name      The function name.
21
     * @param callable $function  The callable to execute.
22
     *
23
     * @return void
24
     */
25
    public static function set(string $namespace, string $name, callable $function)
26
    {
27
        self::evaluate($namespace, $name);
28
        self::$functions[$name] = $function;
29
    }
30
31
    /**
32
     * Returns the custom function or the global function.
33
     *
34
     * @param string $name The function name.
35
     *
36
     * @return callable
37
     */
38
    public static function get(string $name)
39
    {
40
        if (\array_key_exists($name, self::$functions)) {
41
            return self::$functions[$name];
42
        }
43
44
        // return reference to global function
45
        return "\\{$name}";
46
    }
47
48
    /**
49
     * Sets all custom function properties to null.
50
     *
51
     * @param string|null $namespace  The namespace from which the global function will be called.
52
     * @param array       $extensions Array of PHP extensions whose functions will be mocked.
53
     *
54
     * @return void
55
     */
56
    public static function reset(?string $namespace = null, array $extensions = array())
57
    {
58
        self::$functions = array();
59
        foreach ($extensions as $extension) {
60
            foreach (\get_extension_funcs($extension) as $name) {
61
                self::evaluate($namespace, $name);
62
            }
63
        }
64
    }
65
66
    /**
67
     * Helper function to eval a new function call.
68
     *
69
     * @param string $namespace The namespace from which the global function will be called.
70
     * @param string $name      The function name.
71
     *
72
     * @return void
73
     */
74
    private static function evaluate($namespace, $name)
75
    {
76
        //If it's already defined skip it.
77
        if (\function_exists("{$namespace}\\{$name}")) {
78
            return;
79
        }
80
81
        eval("
0 ignored issues
show
introduced by
The use of eval() is discouraged.
Loading history...
82
            namespace {$namespace};
83
            function {$name}() {
84
                return \call_user_func_array(\Chadicus\FunctionRegistry::get('{$name}'), \\func_get_args());
85
            }
86
        ");
87
    }
88
}
89