这是目的是一个示例,php本身就有这样的函数
PHP_FUNCTION(thread_wrok) { zval *cls=NULL,*zvalue=NULL,*z_method; //--------------------------------------------------------- zval ***params=NULL; int arg_count = ZEND_NUM_ARGS(); if (arg_count <1 ) { WRONG_PARAM_COUNT; } params = (zval ***) safe_emalloc(sizeof(zval **), arg_count, 0); if (zend_get_parameters_array_ex(arg_count, params) == FAILURE) { efree(params); RETURN_FALSE; } z_method=*params[0]; if(arg_count>1&¶ms[1]) { cls=*params[1]; } if ( Z_TYPE_P(z_method) != IS_STRING ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "First param must be string"); RETURN_FALSE; } //--------------------------------------------------------- /* char *method; int method_len; if ( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s|o", &method, &method_len, &cls) == FAILURE ) { RETURN_FALSE; } MAKE_STD_ZVAL(z_method); ZVAL_STRING(z_method, method, 1); if (method && zend_hash_find(Z_ARRVAL_P(method_records), method, method_len + 1, (void**)&zvalue) != FAILURE) { RETURN_FALSE; } */ //--------------------------------------------------------- zval *retval_ptr; arg_count = arg_count-2>0?arg_count-2:0; if(Z_TYPE_P(cls) == IS_OBJECT || Z_TYPE_P(cls) == IS_STRING ) { if (call_user_function_ex(EG(function_table), &cls , z_method, &retval_ptr, arg_count, arg_count?params+2:NULL , 0, NULL TSRMLS_CC) == SUCCESS) { if (retval_ptr) { zval_ptr_dtor(&retval_ptr); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call class method: %s()", Z_STRVAL_P(z_method)); RETURN_FALSE; } }else{ if (call_user_function_ex(CG(function_table), NULL, z_method, &retval_ptr, arg_count, arg_count?params+2:NULL , 0, NULL TSRMLS_CC) == SUCCESS ) { if (retval_ptr) { zval_ptr_dtor(&retval_ptr); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s()", Z_STRVAL_P(z_method)); RETURN_FALSE; } } //efree(z_method); RETURN_TRUE; }
调用
<?php $br = (php_sapi_name() == "cli")? "":"<br>"; if(!extension_loaded('threadwork')) { dl('threadwork.' . PHP_SHLIB_SUFFIX); } class a{ function e($a1=0,$a2="") { echo "method e,$a1,$a2\n"; } } function e($a1=0,$a2="") { echo "function e,$a1,$a2\n"; } $a=new a(); if(thread_wrok("e",$a)) { echo "a-> OK\n"; } else echo "NO\n"; if(thread_wrok("e","a",date("Y-m-d H:i:s"))) { echo "&a->e OK\n"; } if(thread_wrok("e",&$a,date("Y-m-d H:i:s"))) { echo "&a->e OK\n"; } thread_wrok($a); if(thread_wrok("e",NULL,222,'this is str')) { echo "e OK\n"; } else echo "NO\n"; ?>
结果:
method e,0, a-> OK method e,2012-03-01 17:13:21, &a->e OK method e,2012-03-01 17:13:21, &a->e OK Warning: thread_wrok(): First param must be string in /opt/soft/php-5.2.8/ext/threadwork/threadwork.php on line 34 function e,222,this is str e OK
感兴趣的+qq群:95303036