johannes Thu Aug 2 21:53:53 2007 UTC
Added files:
/php-src/tests/lang 041.phpt 042.phpt 043.phpt 044.phpt
Modified files:
/ZendEngine2 zend_language_parser.y
Log:
- Add possibility to call static class members using variables (Etienne
Kneuss)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_parser.y?r1=1.186&r2=1.187&diff_format=u
Index: ZendEngine2/zend_language_parser.y
diff -u ZendEngine2/zend_language_parser.y:1.186
ZendEngine2/zend_language_parser.y:1.187
--- ZendEngine2/zend_language_parser.y:1.186 Fri Jul 27 09:04:12 2007
+++ ZendEngine2/zend_language_parser.y Thu Aug 2 21:53:53 2007
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_parser.y,v 1.186 2007/07/27 09:04:12 dmitry Exp $ */
+/* $Id: zend_language_parser.y,v 1.187 2007/08/02 21:53:53 johannes Exp $ */
/*
* LALR shift/reduce conflicts and how they are resolved:
@@ -649,6 +649,12 @@
| 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 @@
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 @@
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); }
;
%%
http://cvs.php.net/viewvc.cgi/php-src/tests/lang/041.phpt?view=markup&rev=1.1
Index: php-src/tests/lang/041.phpt
+++ php-src/tests/lang/041.phpt
--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
http://cvs.php.net/viewvc.cgi/php-src/tests/lang/042.phpt?view=markup&rev=1.1
Index: php-src/tests/lang/042.phpt
+++ php-src/tests/lang/042.phpt
--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
http://cvs.php.net/viewvc.cgi/php-src/tests/lang/043.phpt?view=markup&rev=1.1
Index: php-src/tests/lang/043.phpt
+++ php-src/tests/lang/043.phpt
--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
http://cvs.php.net/viewvc.cgi/php-src/tests/lang/044.phpt?view=markup&rev=1.1
Index: php-src/tests/lang/044.phpt
+++ php-src/tests/lang/044.phpt
--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 CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php