ForwardsCalls.php
1.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\Utils\Traits;
use BadMethodCallException;
use Error;
use function get_class;
trait ForwardsCalls
{
/**
* Forward a method call to the given object.
*
* @param mixed $object
* @throws Error
*/
protected function forwardCallTo($object, string $method, array $parameters)
{
try {
return $object->{$method}(...$parameters);
} catch (Error|BadMethodCallException $e) {
$pattern = '~^Call to undefined method (?P<class>[^:]+)::(?P<method>[^\(]+)\(\)$~';
if (! preg_match($pattern, $e->getMessage(), $matches)) {
throw $e;
}
if ($matches['class'] !== get_class($object) || $matches['method'] !== $method) {
throw $e;
}
static::throwBadMethodCallException($method);
}
}
/**
* Throw a bad method call exception for the given method.
* @throws BadMethodCallException
*/
protected static function throwBadMethodCallException(string $method): void
{
throw new BadMethodCallException(sprintf('Call to undefined method %s::%s()', static::class, $method));
}
}