Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:29067 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 48869 invoked by uid 1010); 27 Apr 2007 12:43:33 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 48854 invoked from network); 27 Apr 2007 12:43:33 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 27 Apr 2007 12:43:33 -0000 Authentication-Results: pb1.pair.com smtp.mail=colder@php.net; spf=permerror; sender-id=unknown Authentication-Results: pb1.pair.com header.from=colder@php.net; sender-id=unknown Received-SPF: error (pb1.pair.com: domain php.net from 213.239.212.54 cause and error) X-PHP-List-Original-Sender: colder@php.net X-Host-Fingerprint: 213.239.212.54 dns1.omne-serveurs.net Linux 2.4/2.6 Received: from [213.239.212.54] ([213.239.212.54:42389] helo=dns1.omne-serveurs.net) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 11/75-29041-2FFE1364 for ; Fri, 27 Apr 2007 08:43:31 -0400 Received: (qmail 17871 invoked from network); 27 Apr 2007 12:43:27 -0000 Received: from 84.74.75.107 by dns1 (envelope-from , uid 1004) with qmail-scanner-1.23 (clamdscan: 0.82. spamassassin: 3.0.1. perlscan: 1.32. Clear:RC:1(84.74.75.107):. Processed in 0.07383 secs); 27 Apr 2007 12:43:27 -0000 Received: from 84-74-75-107.dclient.hispeed.ch (HELO ?10.0.0.1?) (84.74.75.107) by dns1.omne-serveurs.net with (DHE-RSA-AES256-SHA encrypted) SMTP; 27 Apr 2007 12:43:26 -0000 Message-ID: <4631EE73.4050409@php.net> Date: Fri, 27 Apr 2007 14:37:07 +0200 User-Agent: Thunderbird 1.5.0.7 (X11/20060909) MIME-Version: 1.0 To: internals@lists.php.net Content-Type: multipart/mixed; boundary="------------060704050102010302000808" Subject: [patch] Dynamic access of static members/methods, and constants From: colder@php.net (Etienne Kneuss) --------------060704050102010302000808 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, I've already proposed that 1-2 months ago, but now seems to be a good time to discuss new things, so let's try again: I believe it would be nice to be able to dynamically reference static members, constants, and methods. Currently, there is no way to do that and the only way would be to create a static method and use call_user_func(array($classname, 'getThat')); In other words: class A { public static $foo = 'value1'; const gee = 'value2'; public static function bar() { return 'value3'; } // old way: public static function getFoo() { return self::$foo; } public static function getGee() { return self::gee; } } $classname = 'A'; echo $classname::$foo; // value1 echo $classname::gee; // value2 echo $classname::bar(); // value3 // --- instead of: --- $classname = 'A'; echo call_user_func(array($classname, 'getFoo')); // value1 echo call_user_func(array($classname, 'getGee')); // value2 echo call_user_func(array($classname, 'bar')); // value3 which is quite slow. Please take a look at the patch[1] I made for it. Comments would be appreciated! Regards, 1: http://patches.colder.ch/Zend/dynamic-static-calls.patch?markup -- Etienne Kneuss http://www.colder.ch colder@php.net Men never do evil so completely and cheerfully as when they do it from a religious conviction. -- Pascal --------------060704050102010302000808 Content-Type: text/plain; name="dynamic-static-calls.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="dynamic-static-calls.patch" Index: Zend/zend_language_parser.y =================================================================== RCS file: /repository/ZendEngine2/zend_language_parser.y,v retrieving revision 1.179 diff -u -r1.179 zend_language_parser.y --- Zend/zend_language_parser.y 4 Mar 2007 16:25:57 -0000 1.179 +++ Zend/zend_language_parser.y 6 Mar 2007 14:43:49 -0000 @@ -642,6 +642,12 @@ | fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); } function_call_parameter_list ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); } + function_call_parameter_list + ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); } + function_call_parameter_list + ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} | variable_without_objects '(' { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_dynamic_function_call(&$1 TSRMLS_CC); } function_call_parameter_list ')' { zend_do_end_function_call(&$1, &$$, &$4, 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} @@ -795,6 +801,11 @@ static_member: fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_static_member(&$$, &$1 TSRMLS_CC); } + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_static_member(&$$, &$1 TSRMLS_CC); } +; + +variable_class_name: + reference_variable { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_fetch_class(&$$, &$1 TSRMLS_CC); } ; @@ -930,6 +941,7 @@ class_constant: fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT TSRMLS_CC); } + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT TSRMLS_CC); } ; %% Index: tests/lang/041.phpt =================================================================== RCS file: tests/lang/041.phpt diff -N tests/lang/041.phpt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/lang/041.phpt 6 Mar 2007 14:43:49 -0000 @@ -0,0 +1,14 @@ +--TEST-- +Dynamic access of static members +--FILE-- + +===DONE=== +--EXPECT-- +foo +===DONE=== Index: tests/lang/042.phpt =================================================================== RCS file: tests/lang/042.phpt diff -N tests/lang/042.phpt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/lang/042.phpt 6 Mar 2007 14:43:49 -0000 @@ -0,0 +1,14 @@ +--TEST-- +Dynamic access of constants +--FILE-- + +===DONE=== +--EXPECT-- +foo +===DONE=== Index: tests/lang/043.phpt =================================================================== RCS file: tests/lang/043.phpt diff -N tests/lang/043.phpt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/lang/043.phpt 6 Mar 2007 14:43:49 -0000 @@ -0,0 +1,14 @@ +--TEST-- +Dynamic call for static methods +--FILE-- + +===DONE=== +--EXPECT-- +bar +===DONE=== --------------060704050102010302000808--