Re: Fix inconsistencies in OO calls
| From: | Johannes Schlüter | Date: | Tue, 31 Jul 2007 11:57:15 +0000 |
| Subject: | Re: Fix inconsistencies in OO calls | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-31338@lists.php.net to get a copy of this message | ||
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