Hi Etienne, On Mon, 2007-07-30 at 22:27 +0200, Etienne Kneuss wrote: > Hello, > > Currently, those are allowed: > > new $classname; > classname::$methodname(); > > but those aren't: > > $classname::foo(); > $classname::CONST; > $classname::$member; > > Here is a patch for head that fixes those inconsistencies by extending > the language parser to support such syntax:
thanks for this fix. Ilia, do you mind MFHing this fix before the next 5.2 release? Then I'd commit it within the next days. johannes > http://patches.colder.ch/Zend/dynamic_static_calls.patch?markup (patch > also attached) > > Regards > > plain text document attachment (dynamic_static_calls.patch) > Index: Zend/zend_language_parser.y > =================================================================== > RCS file: /repository/ZendEngine2/zend_language_parser.y,v > retrieving revision 1.186 > diff -u -p -r1.186 zend_language_parser.y > --- Zend/zend_language_parser.y 27 Jul 2007 09:04:12 -0000 1.186 > +++ Zend/zend_language_parser.y 30 Jul 2007 20:28:41 -0000 > @@ -649,6 +649,12 @@ function_call: > | fully_qualified_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 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);} > | 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);} > @@ -809,6 +815,11 @@ variable_without_objects: > > 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); > $$=$1;} > ; > > > @@ -935,6 +946,7 @@ isset_variables: > > 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 30 Jul 2007 20:28:41 -0000 > @@ -0,0 +1,23 @@ > +--TEST-- > +Dynamic access of static members > +--FILE-- > +<?php > +class A { > + public static $b = 'foo'; > +} > + > +$classname = 'A'; > +$binaryClassname = b'A'; > +$wrongClassname = 'B'; > + > +echo $classname::$b."\n"; > +echo $binaryClassname::$b."\n"; > +echo $wrongClassname::$b."\n"; > + > +?> > +===DONE=== > +--EXPECTF-- > +foo > +foo > + > +Fatal error: Class 'B' not found in %s041.php on line %d > 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 30 Jul 2007 20:28:41 -0000 > @@ -0,0 +1,22 @@ > +--TEST-- > +Dynamic access of constants > +--FILE-- > +<?php > +class A { > + const B = 'foo'; > +} > + > +$classname = 'A'; > +$binaryClassname = b'A'; > +$wrongClassname = 'B'; > + > +echo $classname::B."\n"; > +echo $binaryClassname::B."\n"; > +echo $wrongClassname::B."\n"; > +?> > +===DONE=== > +--EXPECTF-- > +foo > +foo > + > +Fatal error: Class 'B' not found in %s042.php on line %d > 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 30 Jul 2007 20:28:41 -0000 > @@ -0,0 +1,22 @@ > +--TEST-- > +Dynamic call for static methods > +--FILE-- > +<?php > +class A { > + static function foo() { return 'foo'; } > +} > + > +$classname = 'A'; > +$binaryClassname = b'A'; > +$wrongClassname = 'B'; > + > +echo $classname::foo()."\n"; > +echo $binaryClassname::foo()."\n"; > +echo $wrongClassname::foo()."\n"; > +?> > +===DONE=== > +--EXPECTF-- > +foo > +foo > + > +Fatal error: Class 'B' not found in %s043.php on line %d > Index: tests/lang/044.phpt > =================================================================== > RCS file: tests/lang/044.phpt > diff -N tests/lang/044.phpt > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ tests/lang/044.phpt 30 Jul 2007 20:28:41 -0000 > @@ -0,0 +1,30 @@ > +--TEST-- > +Dynamic call for static methods dynamically named > +--FILE-- > +<?php > +class A { > + static function foo() { return 'foo'; } > +} > +$classname = 'A'; > +$binaryClassname = b'A'; > +$wrongClassname = 'B'; > + > +$methodname = 'foo'; > +$binaryMethodname = b'foo'; > + > +echo $classname::$methodname()."\n"; > +echo $classname::$binaryMethodname()."\n"; > + > +echo $binaryClassname::$methodname()."\n"; > +echo $binaryClassname::$binaryMethodname()."\n"; > + > +echo $wrongClassname::$binaryMethodname()."\n"; > +?> > +===DONE=== > +--EXPECTF-- > +foo > +foo > +foo > +foo > + > +Fatal error: Class 'B' not found in %s044.php on line %d > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php