Re: [Reflection] Improve logic of ReflectionMethod->invokeArgs() for static methods
| From: | Sebastian Krebs | Date: | Mon, 14 Jan 2013 19:53:38 +0000 |
| Subject: | Re: [Reflection] Improve logic of ReflectionMethod->invokeArgs() for static methods | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-64947@lists.php.net to get a copy of this message | ||
2013/1/14 Alexander Lissachenko <lisachenko.it@gmail.com>
> My use-case is weaving aspects into the methods. Yeah! )
>
> So, I take the original class, rename it and then create a decorator
> class instead of original class with overridden dynamic and static
> methods. Method in the decorator should make some specific logic and
> then just invokes the original static method with Reflection, but the
> scope should be also correct.
>
> For example, previous class First will be renamed during load-time to
> the First_AopProxied:
>
> class First_AopProxied
> {
> public static function foo()
> {
> echo get_called_class();
> }
> }
>
> and decorator will be created
>
> class First extends First_AopProxied
> {
> public static function foo()
> {
> // some logic here, that should call parent method and
> preserve the scope (class First)
> // can not use parent::foo() here, because around advice
> should be able to call this method somewhere in the closure...
> }
> }
>
I must say this example is not really better than the last one (it feels
like it is exactly the same with 2 lines more comments). Also I don't know,
what you mean by "call this method somewhere in the closure"; which
closure?!?
I guess you are in fact looking for regular instance methods.
>
> 2013/1/14 Sebastian Krebs <krebs.seb@gmail.com>:
> >
> >
> >
> > 2013/1/14 Alexander Lissachenko <lisachenko.it@gmail.com>
> >>
> >> Hi! It's my first letter here )
> >>
> >> I want to suggest a small improvement for ReflectionMethod->invoke()
> >> and ReflectionMethod->invokeArgs() methods to support LSB for
> >> overridden static methods. Currently, for invoking static methods
> >> first argument should be null, information about class (scope) is
> >> taken from the reflection class. However, there is one issue that can
> >> not be solved at the current time.
> >>
> >> Suppose, we have two classes:
> >>
> >> class First
> >> {
> >> public static function foo()
> >> {
> >> echo get_called_class();
> >> }
> >> }
> >>
> >> class Second extends First
> >> {
> >> public static function foo()
> >> {
> >> echo "Do not call me, please";
> >> }
> >> }
> >>
> >> Now I want to invoke the First::foo() method with Reflection from the
> >> Second class scope for using LSB. Currently this is impossible:
> >> $class = new ReflectionClass('First');
> >> $class->getMethod('foo')->invokeArgs(null, array()); // Outputs
> >> 'First' as no scope information is passed
> >>
> >>
> >> $class = new ReflectionClass('Second');
> >> $class->getMethod('foo')->invokeArgs(null, array()); // Outputs
> >> 'Do
> >> not call me, please' as method is redefined
> >>
> >> So, there is no way now to invoke the static First::foo() method from
> >> the child scope because it was redefined. However, this can be easily
> >> implemented by adding the scope for static methods invocation (like
> >> Closure::bindTo()):
> >>
> >> $class = new ReflectionClass('First');
> >> $class->getMethod('foo')->invokeArgs('Second', array()); //
> >> Outputs
> >> 'Second'
> >>
> >> This improvement can be very useful for building proxies for static
> >> methods, that use LSB. Can it be implemented for PHP 5.3-5.5? Thanks!
> >
> >
> > Maybe it's just me, but could you explain which use-case want to solve?
> The
> > example isn't very useful, because you can achieve this quite easy
> without
> > reflection. Also why do you override the method, when you don't want it
> to
> > get called? Shouldn't they two separate methods then?
> >
> > <?php
> > class First
> > {
> > public static function foo()
> > {
> > echo get_called_class();
> > }
> > }
> >
> > class Second extends First
> > {
> > public static function foo()
> > {
> > echo "Do not call me, please";
> > }
> > public static function bar() {
> > parent::foo();
> > }
> > }
> > Second::bar();
> >
> > http://codepad.viper-7.com/fwG5GB
> >
> >>
> >>
> >> --
> >> PHP Internals - PHP Runtime Development Mailing List
> >> To unsubscribe, visit: http://www.php.net/unsub.php
> >>
> >
> >
> >
> > --
> > github.com/KingCrunch
>
--
github.com/KingCrunch