Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:64945 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 37774 invoked from network); 14 Jan 2013 19:46:14 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 14 Jan 2013 19:46:14 -0000 Authentication-Results: pb1.pair.com smtp.mail=lisachenko.it@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=lisachenko.it@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.212.42 as permitted sender) X-PHP-List-Original-Sender: lisachenko.it@gmail.com X-Host-Fingerprint: 209.85.212.42 mail-vb0-f42.google.com Received: from [209.85.212.42] ([209.85.212.42:47353] helo=mail-vb0-f42.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id CA/D7-22727-58064F05 for ; Mon, 14 Jan 2013 14:46:14 -0500 Received: by mail-vb0-f42.google.com with SMTP id fa15so3954948vbb.1 for ; Mon, 14 Jan 2013 11:46:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=lmxV355tR1wpjFy/Egcb23wYP2JHqHCRnHtsea+ozNQ=; b=bmENWdIXoHeB88ict4DmH+Xjc2fSM0T4W8Co0FW4E7S2V8h6Woup93pPeM3tu7kWVc 0SySaX+Xs0ziT1tPhqtB3IsN8r6VSsXVqoBdPUKkOeVSm8Dm/bg+nUEeHnXOQweC3oL4 s1zjTjxaBBLhA6cYAKoBFEYSzRHAMGE++xcltK5r51n7gAWSh/8UVr6PIZKLbA+tVFMM lzRdpa7Cb1UQ8R/GigOEl+3CkFaWiZXuWHfXiCI+35K23Ol4LC1ZeGcx9MMaZlfGyWGW dKUaZ5t9jme4fklPdY6JPUDZxvI0boOSFFkFWMi1xbtBvH6jE/12aG/G/4Bp++8orM1V 9Jzw== MIME-Version: 1.0 Received: by 10.52.66.18 with SMTP id b18mr88219855vdt.43.1358192770699; Mon, 14 Jan 2013 11:46:10 -0800 (PST) Received: by 10.59.6.42 with HTTP; Mon, 14 Jan 2013 11:46:10 -0800 (PST) In-Reply-To: References: Date: Mon, 14 Jan 2013 23:46:10 +0400 Message-ID: To: Sebastian Krebs Cc: PHP internals list Content-Type: text/plain; charset=UTF-8 Subject: Re: [PHP-DEV] [Reflection] Improve logic of ReflectionMethod->invokeArgs() for static methods From: lisachenko.it@gmail.com (Alexander Lissachenko) 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... } } 2013/1/14 Sebastian Krebs : > > > > 2013/1/14 Alexander Lissachenko >> >> 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? > > 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