123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- <?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\Macroable;
- use BadMethodCallException;
- use Closure;
- use ReflectionClass;
- use ReflectionMethod;
- /**
- * This file come from illuminate/macroable,
- * thanks Laravel Team provide such a useful class.
- */
- trait Macroable
- {
- /**
- * The registered string macros.
- *
- * @var array
- */
- protected static $macros = [];
- /**
- * Dynamically handle calls to the class.
- *
- * @param string $method
- * @param array $parameters
- * @throws \BadMethodCallException
- * @return mixed
- */
- public static function __callStatic($method, $parameters)
- {
- if (! static::hasMacro($method)) {
- throw new BadMethodCallException(sprintf(
- 'Method %s::%s does not exist.',
- static::class,
- $method
- ));
- }
- $macro = static::$macros[$method];
- if ($macro instanceof Closure) {
- $macro = $macro->bindTo(null, static::class);
- }
- return $macro(...$parameters);
- }
- /**
- * Dynamically handle calls to the class.
- *
- * @param string $method
- * @param array $parameters
- * @throws \BadMethodCallException
- * @return mixed
- */
- public function __call($method, $parameters)
- {
- if (! static::hasMacro($method)) {
- throw new BadMethodCallException(sprintf(
- 'Method %s::%s does not exist.',
- static::class,
- $method
- ));
- }
- $macro = static::$macros[$method];
- if ($macro instanceof Closure) {
- $macro = $macro->bindTo($this, static::class);
- }
- return $macro(...$parameters);
- }
- /**
- * Register a custom macro.
- *
- * @param string $name
- * @param callable|object $macro
- */
- public static function macro($name, $macro)
- {
- static::$macros[$name] = $macro;
- }
- /**
- * Mix another object into the class.
- *
- * @param object $mixin
- * @param bool $replace
- *
- * @throws \ReflectionException
- */
- public static function mixin($mixin, $replace = true)
- {
- $methods = (new ReflectionClass($mixin))->getMethods(
- ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED
- );
- foreach ($methods as $method) {
- if ($replace || ! static::hasMacro($method->name)) {
- $method->setAccessible(true);
- static::macro($method->name, $method->invoke($mixin));
- }
- }
- }
- /**
- * Checks if macro is registered.
- *
- * @param string $name
- * @return bool
- */
- public static function hasMacro($name)
- {
- return isset(static::$macros[$name]);
- }
- }
|