Hi,

It may have already been proposed, but I give it a shot:
I believe it would be nice to be able to dynamically reference static members and constants.

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 = 'bar';
   const gee = 'zzz';

   public static function getFoo() { return self::$foo; }
}

$classname = 'A';
echo $classname::$foo; // bar
echo $classname::gee; // zzz

// instead of:
echo call_user_func(array($classname, 'getFoo'));

Please take a look at the patch I made for it.

For consistency purposes, I also implemented $classname::myMethod(); even if it's not required. FWIW, I've no strong feeling about it.

Regards,

--
Etienne Kneuss
http://www.colder.ch
[EMAIL PROTECTED]

Men never do evil so completely and cheerfully as when they do it from a religious conviction.
-- Pascal

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 15:05:19 -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 15:05:19 -0000
@@ -0,0 +1,14 @@
+--TEST--
+Dynamic access of static members
+--FILE--
+<?php
+class A {
+    public    static $b = 'foo';
+}
+$classname = 'A';
+echo $classname::$b;
+?> 
+===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 15:05:19 -0000
@@ -0,0 +1,14 @@
+--TEST--
+Dynamic access of constants
+--FILE--
+<?php
+class A {
+    const B = 'foo';
+}
+$classname = 'A';
+echo $classname::B;
+?> 
+===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 15:05:19 -0000
@@ -0,0 +1,14 @@
+--TEST--
+Dynamic call for static methods
+--FILE--
+<?php
+class A {
+    static function foo() { return 'bar'; }
+}
+$classname = 'A';
+echo $classname::foo();
+?> 
+===DONE===
+--EXPECT--
+bar 
+===DONE===

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to