溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP7擴展開發(fā)之實現簡單運算函數

發(fā)布時間:2020-09-24 10:45:05 來源:網絡 閱讀:1118 作者:abc965432 欄目:web開發(fā)
實現一個簡單的數學計算函數,傳入3個參數,計算出相應的結果。
 如: 
 
echo "90+20=".cal_culator(90,20,'+');
 
echo "90-20=".cal_culator(90,20,'-');
 
echo "90*20=". cal_culator(90,20,'*');
 
echo "90/20=". cal_culator(90,20,'/');
 
echo "90%20=". cal_culator(90,20,'%'); 
 
 
  1.創(chuàng)建一個新的擴展
	   ./ext_skel --extname=hello
	
  2.vi config.m4   去掉以下3行行首的dnl
          PHP_ARG_ENABLE(hello, whether to enable strive support,
          Make sure that the comment is aligned:
          [  --enable-hello           Enable strive support]) 
            
 3,編寫代碼 
	1.vi hello.c
	
	2.#添加下面的代碼
    	 PHP_FUNCTION(cal_culator)
                {
                    double num1 = 0.0;
                    double num2 = 0.0;
                    zend_string *type;

                   //php7之前用此方式來解析參數
                    #ifndef FAST_ZPP 
                    if (zend_parse_parameters(ZEND_NUM_ARGS(),TSRMLS_CC, "dd|S", &num1, &num2,&type) == FAILURE) {
                        return;
                    }
                    #else
                       ZEND_PARSE_PARAMETERS_START(2, 3)
                          Z_PARAM_DOUBLE(num1)
                          Z_PARAM_DOUBLE(num2)
                          Z_PARAM_OPTIONAL
                          Z_PARAM_STR(type)
                        ZEND_PARSE_PARAMETERS_END();
                   #endif

                  switch(ZSTR_VAL(type)[0])
                  {
                        case '+':
                             RETURN_DOUBLE(num1+num2);
                             break;
                        case '-':
                             RETURN_DOUBLE(num1-num2);
                             break;
                        case '*':
                             RETURN_DOUBLE(num1*num2);
                             break;
                        case '/':
                             RETURN_DOUBLE(num1/num2);
                             break;
                        case '%':
                             RETURN_LONG((int)num1%(int)num2);
                             break;
                   }
         }  
	
         
	3.在數組中添加函數名:
	  const zend_function_entry  hello_functions[] = {
	          PHP_FE(cal_culator, NULL) //cal_culator function      
	}	
	      
   參數解析說明:
     //php7之前的參數解析方法    
         if (zend_parse_parameters(ZEND_NUM_ARGS(),TSRMLS_CC, "dd|S", &num1, &num2,&type) == FAILURE) {
           return;
          }
                    
      ZEND_NUM_ARGS() :內置函數,固定格式,【告訴Zend引擎要取的參數的信息】
      TSRMLS_CC     :用來確保線程安全 
      "dd|S"      : 傳入參數類型【詳見下面參數類型表】可傳入2個double類型參數,或傳入2個double類型參與與一個string類型參數
      &num1,&num2...  :傳入對應參數的存儲地址。  
       
     //php7中的參數解析方法                 
         ZEND_PARSE_PARAMETERS_START(2, 3)     //開始參數解析,最少傳2個參數,最多3個參數
          Z_PARAM_DOUBLE(num1)       //將第一個參數轉換為double類型,傳入參數存儲地址
          Z_PARAM_DOUBLE(num2)       //將第二個參數轉換為double類型, 傳入參數存儲地址
          Z_PARAM_OPTIONAL         //表示|,意為后面的參數可以不傳
          Z_PARAM_STR(type)        //第3個參數轉換為string類型, 傳入參數存儲地址
        ZEND_PARSE_PARAMETERS_END();      //結束參數解析
        
        
     參數類型表:
          d: double 類型
          s: string 類型
          l:long 類型 
          |:或的意思,表示后面的可傳可不傳 
       
               
      返回值說明:
          RETURN_DOUBLE   :返回浮點型
          RETURN_LONG     :返回整型 
   
         
  4.編譯安裝擴展,
       phpize
       ./configure --with-php-config=php_conf_dir
       make && make install
       vi php.ini  
       extension=strive.so       
       reload php-fpm 
 
 
 5.測試cal_culator函數是否可用:
             php -r 'echo cal_culator(10,40,'+');'

   源碼地址:https://github.com/yq918/php-ext-strive.git

   若實現方法有誤或有更好的實現方法,歡迎大家給予批評與指導。

 

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI