2013/1/14 Alexander Lissachenko <lisachenko...@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....@gmail.com>:
> >
> >
> >
> > 2013/1/14 Alexander Lissachenko <lisachenko...@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

Reply via email to