timandes/reflection

反射相关库

v0.4.0 2019-09-27 09:13 UTC

This package is auto-updated.

Last update: 2024-09-27 20:38:32 UTC


README

JDK 类似动态代理

interface Foo
{
    public function foo();
}

interface Bar
{
    public function bar();
}

class DefaultFooBar implements Foo, Bar
{
    public function foo()
    {
        echo 'DefaultFooBar::foo()' . PHP_EOL;
        return 'foo';
    }
    public function bar()
    {
        echo 'DefaultFooBar::bar()' . PHP_EOL;
        return 'bar';
    }
}

use Timandes\Reflection\Proxy;

$fooBar = new DefaultFooBar();
$fooBarProxy = Proxy::newProxyInstance($fooBar, [Foo::class, Bar::class], function($proxy, \ReflectionMethod $method, array $args) use($fooBar) {
    echo "Before invoking" . PHP_EOL;
    return $method->invokeArgs($fooBar, $args);
});
$fooBarProxy->foo();

输出

Before invoking
DefaultFooBar::foo()

CGLib 类似动态代理

class BaseFoo
{
    public function bar()
    {
        echo 'BaseFoo::bar()' . PHP_EOL;
        return 'bar';
    }
}

use Timandes\Reflection\Enhancer;

$foo = new BaseFoo();
$fooProxy = Enhancer::createInstance(BaseFoo::class, function($object, \ReflectionMethod $method, array $args) use($foo) {
    echo 'Before invoking' . PHP_EOL;
    return $method->invokeArgs($foo, $args);
});
$fooProxy->bar();

输出

Before invoking
BaseFoo::bar()