This is what I was trying to do, class master { function static_test($var) { $class = get_class() <- this wont work obviously :) $ret = new $class(); $ret->get($var); if (!$ret->N) return; return $ret; } }
class slave extends master { function get($var) { $this->N=1; } } if ($obj = slave::static_test(123)) $obj->do_stuff(); ..... basically there is no way that I can see to get the called class out of the so that it would make a slave when called, not a master :) From a breif (well at least an hour or so :) look at the zend code - this was the solution i came up with - to extend the zend function to have an additional called_function_name pointer to store this in and have a extra magic define __CALLED_FUNCTION__ --- below are my notes how it might be done - is there any major objection/better ideas, before I waste some time playing with it :) zend_compile.h 132 <http://lxr.php.net/source/Zend/zend_compile.h#132> typedef union _zend_function <http://lxr.php.net/ident?i=_zend_function> { 133 <http://lxr.php.net/source/Zend/zend_compile.h#133> zend_uchar <http://lxr.php.net/ident?i=zend_uchar> type <http://lxr.php.net/ident?i=type>; *//* MUST be the first element of this struct! *//* 134 <http://lxr.php.net/source/Zend/zend_compile.h#134> struct { 135 <http://lxr.php.net/source/Zend/zend_compile.h#135> zend_uchar <http://lxr.php.net/ident?i=zend_uchar> type <http://lxr.php.net/ident?i=type>; *//* never used *//* 136 <http://lxr.php.net/source/Zend/zend_compile.h#136> zend_uchar <http://lxr.php.net/ident?i=zend_uchar> *arg_types; 137 <http://lxr.php.net/source/Zend/zend_compile.h#137> char *function_name; char *called_function_name; 138 <http://lxr.php.net/source/Zend/zend_compile.h#138> } common <http://lxr.php.net/ident?i=common>; 139 <http://lxr.php.net/source/Zend/zend_compile.h#139> 140 <http://lxr.php.net/source/Zend/zend_compile.h#140> zend_op_array <http://lxr.php.net/ident?i=zend_op_array> op_array; 141 <http://lxr.php.net/source/Zend/zend_compile.h#141> zend_internal_function <http://lxr.php.net/ident?i=zend_internal_function> internal_function; 142 <http://lxr.php.net/source/Zend/zend_compile.h#142> zend_overloaded_function <http://lxr.php.net/ident?i=zend_overloaded_function> overloaded_function; 143 <http://lxr.php.net/source/Zend/zend_compile.h#143> } zend_function <http://lxr.php.net/ident?i=zend_function>; 144 <http://lxr.php.net/source/Zend/zend_compile.h#144> zend_execute.c ZEND_INIT_FCALL_BY_NAME <http://lxr.php.net/ident?i=ZEND_INIT_FCALL_BY_NAME>: { 1484 <http://lxr.php.net/source/Zend/zend_execute.c#1484> zval <http://lxr.php.net/ident?i=zval> *function_name; 1485 <http://lxr.php.net/source/Zend/zend_execute.c#1485> zend_function <http://lxr.php.net/ident?i=zend_function> *function <http://lxr.php.net/ident?i=function>; 1486 <http://lxr.php.net/source/Zend/zend_execute.c#1486> HashTable <http://lxr.php.net/ident?i=HashTable> *active_function_table; 1487 <http://lxr.php.net/source/Zend/zend_execute.c#1487> zval <http://lxr.php.net/ident?i=zval> tmp; 1488 <http://lxr.php.net/source/Zend/zend_execute.c#1488> char *called_function_name=NULL; if (zend_hash_find <http://lxr.php.net/ident?i=zend_hash_find>(EG <http://lxr.php.net/ident?i=EG>(class_table), EX <http://lxr.php.net/ident?i=EX>(opline)->op1.u.constant.value <http://lxr.php.net/ident?i=value>.str <http://lxr.php.net/ident?i=str>.val <http://lxr.php.net/ident?i=val>, EX <http://lxr.php.net/ident?i=EX>(opline)->op1.u.constant.value <http://lxr.php.net/ident?i=value>.str <http://lxr.php.net/ident?i=str>.len <http://lxr.php.net/ident?i=len>+1, (void **) &ce)==FAILURE <http://lxr.php.net/ident?i=FAILURE>) { *//* class doesn't exist *//* 1522 <http://lxr.php.net/source/Zend/zend_execute.c#1522> zend_error <http://lxr.php.net/ident?i=zend_error>(E_ERROR <http://lxr.php.net/ident?i=E_ERROR>, /"Undefined class name '%s'"/, EX <http://lxr.php.net/ident?i=EX>(opline)->op1.u.constant.value <http://lxr.php.net/ident?i=value>.str <http://lxr.php.net/ident?i=str>.val <http://lxr.php.net/ident?i=val>); 1523 <http://lxr.php.net/source/Zend/zend_execute.c#1523> } called_function_name = (char *) EX <http://lxr.php.net/ident?i=EX>(opline)->op1.u.constant.value <http://lxr.php.net/ident?i=value>.str <http://lxr.php.net/ident?i=str>.val <http://lxr.php.net/ident?i=val>; 1524 <http://lxr.php.net/source/Zend/zend_execute.c#1524> active_function_table = &ce->function_table <http://lxr.php.net/ident?i=function_table>; 1525 <http://lxr.php.net/source/Zend/zend_execute.c#1525> } 1566 <http://lxr.php.net/source/Zend/zend_execute.c#1566> zval_dtor <http://lxr.php.net/ident?i=zval_dtor>(&tmp); function.called_function_name = called_function_name; 1567 <http://lxr.php.net/source/Zend/zend_execute.c#1567> EX <http://lxr.php.net/ident?i=EX>(fbc) = function <http://lxr.php.net/ident?i=function>; 1568 <http://lxr.php.net/source/Zend/zend_execute.c#1568> overloa...... zend_execute_API.c 219 <http://lxr.php.net/source/Zend/zend_execute_API.c#219> ZEND_API <http://lxr.php.net/ident?i=ZEND_API> char *get_active_function_name <http://lxr.php.net/ident?i=get_active_function_name>(TSRMLS_D <http://lxr.php.net/ident?i=TSRMLS_D>) 220 <http://lxr.php.net/source/Zend/zend_execute_API.c#220> { 221 <http://lxr.php.net/source/Zend/zend_execute_API.c#221> switch(EG <http://lxr.php.net/ident?i=EG>(function_state_ptr)->function <http://lxr.php.net/ident?i=function>->type <http://lxr.php.net/ident?i=type>) { 222 <http://lxr.php.net/source/Zend/zend_execute_API.c#222> case ZEND_USER_FUNCTION <http://lxr.php.net/ident?i=ZEND_USER_FUNCTION>: { 223 <http://lxr.php.net/source/Zend/zend_execute_API.c#223> char *function_name = ((zend_op_array <http://lxr.php.net/ident?i=zend_op_array> *) EG <http://lxr.php.net/ident?i=EG>(function_state_ptr)->function <http://lxr.php.net/ident?i=function>)->function_name; 224 <http://lxr.php.net/source/Zend/zend_execute_API.c#224> 225 <http://lxr.php.net/source/Zend/zend_execute_API.c#225> if (function_name) { 226 <http://lxr.php.net/source/Zend/zend_execute_API.c#226> return function_name; 227 <http://lxr.php.net/source/Zend/zend_execute_API.c#227> } else { 228 <http://lxr.php.net/source/Zend/zend_execute_API.c#228> return /"main"/; 229 <http://lxr.php.net/source/Zend/zend_execute_API.c#229> } 230 <http://lxr.php.net/source/Zend/zend_execute_API.c#230> } 231 <http://lxr.php.net/source/Zend/zend_execute_API.c#231> break; 232 <http://lxr.php.net/source/Zend/zend_execute_API.c#232> case ZEND_INTERNAL_FUNCTION <http://lxr.php.net/ident?i=ZEND_INTERNAL_FUNCTION>: 233 <http://lxr.php.net/source/Zend/zend_execute_API.c#233> return ((zend_internal_function <http://lxr.php.net/ident?i=zend_internal_function> *) EG <http://lxr.php.net/ident?i=EG>(function_state_ptr)->function <http://lxr.php.net/ident?i=function>)->function_name; 234 <http://lxr.php.net/source/Zend/zend_execute_API.c#234> break; 235 <http://lxr.php.net/source/Zend/zend_execute_API.c#235> default: 236 <http://lxr.php.net/source/Zend/zend_execute_API.c#236> return NULL <http://lxr.php.net/ident?i=NULL>; 237 <http://lxr.php.net/source/Zend/zend_execute_API.c#237> } 238 <http://lxr.php.net/source/Zend/zend_execute_API.c#238> } 239 <http://lxr.php.net/source/Zend/zend_execute_API.c#239> 219 <http://lxr.php.net/source/Zend/zend_execute_API.c#219> ZEND_API <http://lxr.php.net/ident?i=ZEND_API> char *get_called_function_name <http://lxr.php.net/ident?i=get_active_function_name>(TSRMLS_D <http://lxr.php.net/ident?i=TSRMLS_D>) 220 <http://lxr.php.net/source/Zend/zend_execute_API.c#220> { 221 <http://lxr.php.net/source/Zend/zend_execute_API.c#221> switch(EG <http://lxr.php.net/ident?i=EG>(function_state_ptr)->function <http://lxr.php.net/ident?i=function>->type <http://lxr.php.net/ident?i=type>) { 222 <http://lxr.php.net/source/Zend/zend_execute_API.c#222> case ZEND_USER_FUNCTION <http://lxr.php.net/ident?i=ZEND_USER_FUNCTION>: { 223 <http://lxr.php.net/source/Zend/zend_execute_API.c#223> char *function_name = ((zend_op_array <http://lxr.php.net/ident?i=zend_op_array> *) EG <http://lxr.php.net/ident?i=EG>(function_state_ptr)->function <http://lxr.php.net/ident?i=function>)->called_function_name; 224 <http://lxr.php.net/source/Zend/zend_execute_API.c#224> 225 <http://lxr.php.net/source/Zend/zend_execute_API.c#225> if (function_name) { 226 <http://lxr.php.net/source/Zend/zend_execute_API.c#226> return function_name; 227 <http://lxr.php.net/source/Zend/zend_execute_API.c#227> } else { 228 <http://lxr.php.net/source/Zend/zend_execute_API.c#228> return /"main"/; 229 <http://lxr.php.net/source/Zend/zend_execute_API.c#229> } 230 <http://lxr.php.net/source/Zend/zend_execute_API.c#230> } 231 <http://lxr.php.net/source/Zend/zend_execute_API.c#231> break; 232 <http://lxr.php.net/source/Zend/zend_execute_API.c#232> case ZEND_INTERNAL_FUNCTION <http://lxr.php.net/ident?i=ZEND_INTERNAL_FUNCTION>: 233 <http://lxr.php.net/source/Zend/zend_execute_API.c#233> return ((zend_internal_function <http://lxr.php.net/ident?i=zend_internal_function> *) EG <http://lxr.php.net/ident?i=EG>(function_state_ptr)->function <http://lxr.php.net/ident?i=function>)->function_name; 234 <http://lxr.php.net/source/Zend/zend_execute_API.c#234> break; 235 <http://lxr.php.net/source/Zend/zend_execute_API.c#235> default: 236 <http://lxr.php.net/source/Zend/zend_execute_API.c#236> return NULL <http://lxr.php.net/ident?i=NULL>; 237 <http://lxr.php.net/source/Zend/zend_execute_API.c#237> } 238 <http://lxr.php.net/source/Zend/zend_execute_API.c#238> } 239 <http://lxr.php.net/source/Zend/zend_execute_API.c#239> zend_language_parser.l <ST_IN_SCRIPTING>"__CALLED_FUNCTION__" { 904 <http://lxr.php.net/source/Zend/zend_language_scanner.l#904> char *called_function = get_called_function_name(TSRMLS_C); 905 <http://lxr.php.net/source/Zend/zend_language_scanner.l#905> 906 <http://lxr.php.net/source/Zend/zend_language_scanner.l#906> if (!called_function) { 907 <http://lxr.php.net/source/Zend/zend_language_scanner.l#907> called_function= ""; 908 <http://lxr.php.net/source/Zend/zend_language_scanner.l#908> } 909 <http://lxr.php.net/source/Zend/zend_language_scanner.l#909> zendlval->value.str.len = strlen(called_function); 910 <http://lxr.php.net/source/Zend/zend_language_scanner.l#910> zendlval->value.str.val = estrndup(called_function, zendlval->value.str.len); 911 <http://lxr.php.net/source/Zend/zend_language_scanner.l#911> zendlval->type = IS_STRING; 912 <http://lxr.php.net/source/Zend/zend_language_scanner.l#912> return T_CFUNCTION; 913 <http://lxr.php.net/source/Zend/zend_language_scanner.l#913> } 126 <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#126> %token T_FILE <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#127> %token T_CFUNCTION <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#127> zend_language_parser.y common_scalar: 597 <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#597> T_LNUMBER { $$ = $1; } 598 <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#598> | T_DNUMBER { $$ = $1; } 599 <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#599> | T_CONSTANT_ENCAPSED_STRING { $$ = $1; } 600 <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#600> | T_LINE { $$ = $1; } 601 <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#601> | T_FILE { $$ = $1; } 602 <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#602> T_CFUNCTION { $$ = $1; } 602 <http://lxr.php.net/source/ZendEngine2/zend_language_parser.y#602> ; -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php