php7擴展開發[5]本類內函數調用

1.須要實現的細節

  • 在第三節,有個調用函數的例子,咱們來稍微細說下
  • 而後就是平時你們定義了類裏面的方法,有時候有相互調用,咱們寫一個例子

2.person擴展

2.1在php_person.h中增長:

PHP_METHOD(person_ce,callback); PHP_METHOD(person_ce,setkey); 

2.2 實現代碼

在php_initest.h中打開全局變量設置塊的註釋,改爲本身相要的變量以下php

//新增定義 ZEND_BEGIN_ARG_INFO_EX(global_setkey_arg, 0, 0, 2) ZEND_ARG_INFO(0, setkey1) ZEND_ARG_INFO(0, setkey2) ZEND_END_ARG_INFO() const zend_function_entry person_functions[] = { ZEND_ME(person, __construct, global_config_arg, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) ZEND_ME(person,doing,NULL,ZEND_ACC_PUBLIC) ZEND_ME(person,saying,NULL,ZEND_ACC_PUBLIC) //增長兩個類裏面的方法 ZEND_ME(person,callback,NULL,ZEND_ACC_PUBLIC) ZEND_ME(person,setkey,global_setkey_arg,ZEND_ACC_PUBLIC) ZEND_ME(person,__destruct,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_DTOR) PHP_FE_END /* Must be the last line in person_functions[] */ }; ZEND_METHOD(person,setkey){ zval *param1; zval *param2; //#include <zend_API.h> //int zend_parse_parameters ( int num_args TSRMLS_DC, char* type_spec, ... ) if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|z",&param1,&param2) == FAILURE) { RETURN_FALSE; } zend_update_property(person_ce, getThis(), "param1", sizeof("param1")-1, param1 TSRMLS_CC); zend_update_property(person_ce, getThis(), "param2", sizeof("param2")-1, param2 TSRMLS_CC); } ZEND_METHOD(person,callback){ //#include <zend_interfaces.h> //zval* zend_call_method_with_0_params ( ... obj, zend_class_entry* obj_ce, zend_function** fn_proxy, char* function_name, ... retval ) //zval* zend_call_method_with_1_params ( ... obj, zend_class_entry* obj_ce, zend_function** fn_proxy, char* function_name, ... retval, zval* arg1 ) //zval* zend_call_method_with_2_params ( ... obj, zend_class_entry* obj_ce, zend_function** fn_proxy, char* function_name, ... retval, zval* arg1, zval* arg2 ) //zval* zend_call_method ( zval** object_pp, zend_class_entry* obj_ce, zend_function** fn_proxy, char* function_name, int function_name_len, zval** retval_ptr_ptr, int param_count, zval* arg1, zval* arg2, magic TSRMLS_DC ) zend_call_method_with_0_params(getThis(),person_ce,NULL,"doing",return_value); } ZEND_METHOD(person,callback_function){ //聲明一個對象變量 zval *object_name; object_init_ex(object_name,person_ce); //聲明函數名變量 zval function_name; ZVAL_STRING(&function_name,"doing"); //聲明承接返回值的變量 zval retval; // 調用類的 doing 方法 if(call_user_function(EG(function_table), object_name, &function_name, &retval, 0, NULL)==FAILURE){ RETURN_NULL(); // zend_error(E_ERROR,"call person doing error"); } //釋放資源空間 *return_value=*retval; zval_copy_ctor(return_value); zval_ptr_dtor(&retval); } 

2.3 相關內容

type_spec是格式化字符串,其常見的含義以下:
參數   表明着的類型
b   Boolean l Integer 整型 d Floating point 浮點型 s String 字符串 r Resource 資源 a Array 數組 o Object instance 對象 O Object instance of a specified type 特定類型的對象 z Non-specific zval 任意類型~ Z zval**類型 f 表示函數、方法名稱 對應的接收變量類型 參數 對應C裏的數據類型 b zend_bool l long d double s char*, int 前者接收指針,後者接收長度 r zval* a zval* o zval* O zval*, zend_class_entry* z zval* Z zval** zend_parse_parameters中的 | ,這個表示 在它以前的參數是必須的,以後的是非必須的 
2.4 擴展使用
[root@bogon tests]# cat test.php <?php $n = new person(array('key'=>'value')); $n->setkey('testparam1','testparam2'); var_dump($n->param1); var_dump($n->param2); [root@bogon tests]# php test.php string(10) "testparam1" string(10) "testparam2" array(1) { ["key"]=> string(5) "value" } 
  • 請尊重本人勞動成功,能夠隨意轉載但保留如下信息
  • 做者:歲月經年
  • 時間:2016年03月
  • 首發:http://www.djhull.com
相關文章
相關標籤/搜索