搜尋
首頁後端開發PHP7實例講解PHP7擴充開發之傳參與回傳值

前言

這次,我們將示範如何在PHP擴充中接受傳入的參數和輸出回傳值。

<?php     function default_value ($type, $value = null) {
        if ($type == "int") {
            return $value ?? 0;
        } else if ($type == "bool") {
            return $value ?? false;
        } else if ($type == "str") {
            return is_null($value) ? "" : $value;
        }
        return null;
    }
 
    var_dump(default_value("int"));
    var_dump(default_value("int", 1));
    var_dump(default_value("bool"));
    var_dump(default_value("bool", true));
    var_dump(default_value("str"));
    var_dump(default_value("str", "a"));
    var_dump(default_value("array"));
?>

我們將在擴充功能中實作default_value方法。 【推薦:《PHP7教學》】

#程式碼

實作default_value方法

##default_value方法的PHP擴充原始碼:

PHP_FUNCTION(default_value)
{
    zend_string     *type;    
    zval            *value = NULL;
 
#ifndef FAST_ZPP
    /* Get function parameters and do error-checking. */
    if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|z", &type, &value) == FAILURE) {
        return;
    }    
#else
    ZEND_PARSE_PARAMETERS_START(1, 2)
        Z_PARAM_STR(type)
        Z_PARAM_OPTIONAL
        Z_PARAM_ZVAL_EX(value, 0, 1)
    ZEND_PARSE_PARAMETERS_END();
#endif
     
    if (ZSTR_LEN(type) == 3 && strncmp(ZSTR_VAL(type), "int", 3) == 0 && value == NULL) {
        RETURN_LONG(0);
    } else if (ZSTR_LEN(type) == 3 && strncmp(ZSTR_VAL(type), "int", 3) == 0 && value != NULL) {
        RETURN_ZVAL(value, 0, 1); 
    } else if (ZSTR_LEN(type) == 4 && strncmp(ZSTR_VAL(type), "bool", 4) == 0 && value == NULL) {
        RETURN_FALSE;
    } else if (ZSTR_LEN(type) == 4 && strncmp(ZSTR_VAL(type), "bool", 4) == 0 && value != NULL) {
        RETURN_ZVAL(value, 0, 1); 
    } else if (ZSTR_LEN(type) == 3 && strncmp(ZSTR_VAL(type), "str", 3) == 0 && value == NULL) {
        RETURN_EMPTY_STRING();
    } else if (ZSTR_LEN(type) == 3 && strncmp(ZSTR_VAL(type), "str", 3) == 0 && value != NULL) {
        RETURN_ZVAL(value, 0, 1); 
    } 
    RETURN_NULL();
}
程式碼說明

取得參數

在PHP7中提供了兩種取得參數的方法。

zend_parse_parameters和FAST ZPP方式。

zend_parse_parameters

在PHP7之前一直使用

zend_parse_parameters函數取得參數。這個函數的作用,就是把傳入的參數轉換成PHP核心中對應的型別,方便在PHP擴充中使用。 參數說明:
第一個參數,參數個數。一般就使用ZEND_NUM_ARGS(),不需要改變。
第二個參數,格式化字串。這個格式化字串的作用就是,指定傳入參數與PHP核心類型的轉換關係。

程式碼中 S|z 的意思是:

S 表示參數是一個字串。要把傳入的參數轉換為zend_string型別。
| 表示之後的參數是可選。可以傳,也可以不傳。
z 表示參數是多種型別。要把傳入的參數轉換為zval型別。

除此之外,還有一些specifier,要注意:

!如果接收了一個PHP語言裡的null變量,則直接將其轉換成C語言裡的NULL,而不是封裝成IS_NULL類型的zval。
/ 如果傳遞過來的變數與別的變數共用一個zval,而且不是引用,則進行強制分離,新的zval的is_ref__gc==0, and refcount__gc==1.

更多格式化字串的意思可以查看官方網站。 https://wiki.php.net/rfc/fast_zpp

FAST ZPP

在PHP7中新提供的方式。是為了提高參數解析的效能。對應經常使用的方法,建議使用FAST ZPP方式。

使用方式:
以ZEND_PARSE_PARAMETERS_START(1, 2)開頭。
第一個參數表示必傳的參數個數,第二個參數表示最多傳入的參數個數。

ZEND_PARSE_PARAMETERS_END();結束。 中間是傳入參數的解析。
值得注意的是,一般FAST ZPP的巨集方法與
zend_parse_parameters的specifier是一一對應的。如:Z_PARAM_OPTIONAL 對應 |
Z_PARAM_STR    對應 S
但是,Z_PARAM_ZVAL_EX方法比較特殊。它對應兩個specifier,分別是 ! 和 / 。 ! 對應宏方法的第二個參數。 / 對應巨集方法的第三個參數。如果想開啟,只要設定為1即可。

FAST ZPP對應的巨集方法可以查看官方網站https://wiki.php.net/rfc/fast_zpp#proposal

傳回值

方法的回傳值是使用

RETURN_開頭的巨集方法進行傳回的。常用的巨集方法有:RETURN_NULL()    回傳null
RETURN_LONG(l)    傳回整數
RETURN_DOUBLE(d) 傳回浮點類型
RETURN_STR(s)    傳回一個字串。參數是一個zend_string * 指標
RETURN_STRING(s)    回傳一個字串。參數是一個char * 指標
RETURN_STRINGL(s, l) 傳回一個字串。第二個參數是字串長度。
RETURN_EMPTY_STRING()    傳回一個空字串。
RETURN_ARR(r)    傳回一個陣列。參數是zend_array *指標。
RETURN_OBJ(r) 傳回一個物件。參數是zend_object *指標。
RETURN_ZVAL(zv, copy, dtor) 傳回任意型別。參數是 zval *指標。
RETURN_FALSE    回傳false
RETURN_TRUE    回傳true

以上是實例講解PHP7擴充開發之傳參與回傳值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具