您的位置:首页 > 编程语言 > PHP开发

根据用户传入的参数调用用户函数的php扩展

2012-03-01 17:05 369 查看
这是目的是一个示例,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: