検索
ホームページバックエンド開発PHP7PHP7拡張開発の戻り値を説明する例

まえがき

今回は、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 メソッドを実装するための PHP 拡張ソース コード

default_value メソッド:

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 ではパラメータを取得する方法が 2 つあります。 zend_parse_parameters および FAST ZPP モード。

zend_parse_parameters

PHP7 より前では、パラメータを取得するために zend_parse_parameters 関数が使用されていました。この関数の機能は、受信パラメータを PHP カーネルの対応する型に変換し、PHP 拡張機能で使用できるようにすることです。
パラメータの説明:
最初のパラメータ、パラメータの数。通常は ZEND_NUM_ARGS() を使用するだけで、変更する必要はありません。
2 番目のパラメータはフォーマット文字列です。このフォーマット文字列の機能は、受信パラメータと PHP コア タイプの間の変換関係を指定することです。

コード内の S|z の意味は次のとおりです。
S はパラメータが文字列であることを意味します。受信パラメータを zend_string 型に変換します。
| は、次のパラメータがオプションであることを示します。伝わるか伝わらないか。
z は、パラメータが複数のタイプであることを示します。受信パラメータを zval 型に変換します。

さらに、注意が必要な指定子がいくつかあります:
! PHP言語でnull変数を受け取った場合、IS_NULL型のzvalにカプセル化せずに、C言語で直接NULLに変換します。
/渡された変数が他の変数と zval を共有しており、参照ではない場合、強制分離が実行されます。新しい zval の is_ref__gc==0、および refcount__gc==1。

その他の形式の意味文字列は公式ウェブサイトで見ることができます。 https://wiki.php.net/rfc/fast_zpp

FAST ZPP

PHP7で新たに提供されました。パラメータ解析のパフォーマンスを向上させるためです。頻繁に使用されるメソッドには、FAST ZPP メソッドを使用することをお勧めします。
使用法:
ZEND_PARSE_PARAMETERS_START(1, 2) から始めます。
最初のパラメータは渡す必要があるパラメータの数を示し、2 番目のパラメータは渡すことができるパラメータの最大数を示します。
ZEND_PARSE_PARAMETERS_END(); で終わります。
中央は、受信パラメータの解析です。
FAST ZPP のマクロ メソッドは通常、zend_parse_parameters の指定子に対応することに注意してください。例:
Z_PARAM_OPTIONAL は |
Z_PARAM_STR に対応 S
ただし、Z_PARAM_ZVAL_EX メソッドは特殊です。これは、! と / の 2 つの指定子に対応します。 ! マクロ メソッドの 2 番目のパラメータに対応します。 / はマクロメソッドの 3 番目のパラメータに対応します。有効にしたい場合は、1 に設定してください。

FAST ZPP の対応マクロメソッドは公式 Web サイト 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) は文字列を返します。 2 番目のパラメータは文字列の長さです。
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 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。