zoukankan      html  css  js  c++  java
  • 根据用户传入的参数调用用户函数的php扩展

    这是目的是一个示例,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

  • 相关阅读:
    2013-2014 NBA 东西部决赛 + 总决赛合集
    小萌库
    小萌库一周电影大合集
    小萌库
    小萌库- 新海诚那些唯美感人的动漫
    小萌库 一周漫画精彩回顾
    小萌库
    Week10-数据库
    Week9-RabbitMQ、Redis、Mysql
    Week8-python(线程、进程、协程)
  • 原文地址:https://www.cnblogs.com/lein317/p/5067632.html
Copyright © 2011-2022 走看看