Passed
Push — master ( c312a7...6efd67 )
by Arnold
01:53
created

call_user_func_assoc()   B

Complexity

Conditions 7
Paths 12

Size

Total Lines 25
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 7

Importance

Changes 0
Metric Value
cc 7
eloc 17
nc 12
nop 2
dl 0
loc 25
ccs 16
cts 16
cp 1
crap 7
rs 8.8333
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace Jasny;
6
7
/**
8
 * Call a callback with named parameters as associative array.
9
 *
10
 * @param callable $callback
11
 * @param array    $params_arr
12
 * @return mixed
13
 * @throws \BadFunctionCallException
14
 * @throws \ReflectionException
15
 */
16
function call_user_func_assoc(callable $callback, array $params_arr)
17
{
18 8
    $refl = is_array($callback)
19 2
        ? new \ReflectionMethod($callback[0], $callback[1])
20 8
        : new \ReflectionFunction($callback);
21
    
22 8
    $args = [];
23 8
    $max = 0;
24 8
    $params = $refl->getParameters();
25
26 8
    foreach ($params as $i => $param) {
27 8
        $key = $param->name;
28
        
29 8
        if (array_key_exists($key, $params_arr)) {
30 6
            $args[] = $params_arr[$key];
31 6
            $max = $i + 1;
32 6
        } elseif ($param->isOptional()) {
33 4
            $args[] = $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null;
34
        } else {
35 2
            $fn = $refl instanceof \ReflectionMethod ? $refl->class . '::' . $refl->name : $refl->name;
36 8
            throw new \BadFunctionCallException("Missing argument '$key' for {$fn}()");
37
        }
38
    }
39
    
40 6
    return call_user_func_array($callback, array_slice($args, 0, $max));
41
}
42