ホームページ バックエンド開発 PHPチュートリアル PHP 拡張機能と埋め込み -- PHP 拡張機能のパラメーター_PHP チュートリアル

PHP 拡張機能と埋め込み -- PHP 拡張機能のパラメーター_PHP チュートリアル

Jul 13, 2016 am 10:42 AM
埋め込む 拡大する

これまでの記事では、関数は受け取るパラメーターと返す型の点で比較的単純ですが、実際にはより複雑になることがよくあります。この記事では主に、PHP 拡張機能の開発においてユーザー空間からパラメーターを受け取り、それに応じてこれらのパラメーターの型、数、その他の情報を確認する方法について説明します。


1. 自動型変換には zend_parse_parameters() を使用します

PHP 拡張機能では、入力パラメーターを取得する最も簡単な方法は、zend_parse_parameters() 関数を使用することです。

この関数の呼び出しの最初の引数は常に ZEND_NUM_ARGS() TSRMLS_CC です。この引数は入力引数の数を int として返します。
2 番目のパラメータは format パラメータで、Zend Engine がサポートするさまざまなタイプに対応する文字列タイプで構成されます。
次の図は、フォーマット パラメータの可能なタイプを示しています。
次のパラメータは、以前にリクエストされたタイプによって異なります。次の例に示すように、比較的単純な型の場合、このパラメーターは通常、参照されるプリミティブです。 ここでの
PHP_FUNCTION(sample_getlong)
{
    long foo;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
                         "l", &foo) == FAILURE) {
        RETURN_NULL();
    }
    php_printf("The integer value of the parameter you "
             "passed is: %ld\n", foo);
    RETURN_TRUE;
}
ログイン後にコピー
は l であり、long 型であるため、それに対応して、事前に long 型の foo パラメータを宣言し、その値を参照渡しします。 以下に、C 言語のパラメータと型のより詳細な対応関係を示します。 b ------ zend_bool l ------- 長い d ------- ダブル s ------- char* 、 int r ------- zval* a ------ zval* o ------ zval* O ----- zval*、zend_class_entry* z ------ zval* Z ----- zval**
複合型の場合は、単純な zval* 型が使用されることに注意してください。これは、複合型を返すときに RETURN_* がない理由と同じです。 ZPP が行うことは、受信した zval* が正しいタイプであることを確認することです。必要に応じて、配列を stdClass オブジェクトに変換するなど、暗黙的な変換も実行します。
s 型の場合、これは非常に特殊で、1 つの char* 1 つの int です。これは主に、PHP の文字列の特殊な構造によるものです。
function sample_hello_world($name) {
    echo "Hello $name!\n";
}
ログイン後にコピー
C 言語では、zend_parse_parameters 関数が使用されます。 れーれー
複数のパラメータがある場合、zend_parse_parameters はこれらのパラメータを左から右に抽出します。 れーれーるーるー
タイプ識別子に加えて、パラメーターの処理方法を変更する 3 つのメタキャラクターがあります。 | : これが表示される場合、前のパラメータは必須で、次のパラメータはオプションであることを意味します。PHP 言語で null 変数を受け取った場合、それはカプセル化されずに C 言語で直接 NULL に変換されます。 IS_NULL型のzval
/: 渡された変数が他の変数と zval を共有しており、真の参照ではない場合、新しい zval の is_ref__gc = 0、refcount__gc = 1 を強制的に分離する必要があります。
オプションのパラメータ: PHP のパラメータにデフォルト値を指定できます: 現時点で
PHP_FUNCTION(sample_hello_world)
{
    char *name;
    int name_len;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
                        &name, &name_len) == FAILURE) {
        RETURN_NULL();
    }
    php_printf("Hello ");
    PHPWRITE(name, name_len);
    php_printf("!\n");
}
ログイン後にコピー
を呼び出す場合、2 番目のパラメータを指定する必要はありません。 れーれー
C の解釈にも同様の実装があります。 れーれー
オプションのパラメータは通常、指定されない限り値を持たないため、デフォルトのパラメータを指定することが重要です。ほとんどの場合、NULL/0 です



IS_NULL VS NULL: 各 zval 型は、最も単純な IS_NULL 型であっても、一定量のメモリ領域を占有します。また、それらの適用と解放にも時間がかかります。したがって、多くの場合、このタイプを使用する必要はありません。次の 2 つのコードで比較が行われます。

りー

強制分離:

変数が関数に渡されるとき、参照によって渡されるかどうかに関係なく、refcount は常に少なくとも 2 になります。1 つはそれ自体であり、もう 1 つは関数に渡されるコピーです。この zval を変更する前に、参照されていないコレクションからそれを分離する必要があります。

/ を使用すると、コピーオンライトで参照される変数 (つまり、誤った参照) が自動的に分離されるため、非常に便利です。

この機能は NULL フラグと同じであり、必要な場合にのみ使用されます。



zend_get_parameters():

古いバージョンの PHP と互換性を持たせたい場合、またはパラメータを受信するためのキャリアとして zval を使用したいだけの場合は、zend_get_parameters() 関数を使用してパラメータを受信することを検討できます zend_parse_parameters() と比較すると、解析せずに直接取得されます。型変換は自動的には実行されません。拡張実装のすべてのパラメーターのキャリアは zval です。

リーリー
同時に、受信が失敗してもエラーをスローしません。また、デフォルト値を持つパラメーターを処理することもできません。解析との最後の違いは、コピーオンライトに準拠するすべての zval を自動的に強制的に分離することです。それをコピーして関数内に送信します。

この関数が必要ない場合は、zend_get_parameters_ex() を使用できます。そのパラメータは zval**

です。

りー


変数パラメータ、任意の数のパラメータを処理します:


2 つの zend_get_parameters_** 関数もあります。これらは、パラメーターが多数ある場合、またはパラメーターの数が事前にわからない状況を解決するために特別に使用されます。 PHP 言語の var_dump() 関数は、任意の数のパラメーターを入力できます。

ZEND_FUNCTION(var_dump) {
    int i, argc = ZEND_NUM_ARGS();
    zval ***args;
 
    args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0);
    if (ZEND_NUM_ARGS() == 0 || zend_get_parameters_array_ex(argc, args) == FAILURE) {
        efree(args);
        WRONG_PARAM_COUNT;
    }
    for (i=0; i<br>
程序首先获取参数数量,然后通过safe_emalloc函数申请相应大小的内存来存储这些zval**的参数。这里使用zend_get_parameters_array_ex()函数来把传递给函数的参数填充到args中。提醒一下,还存在一个zend_get_parameters_array()函数,唯一不同是它将zval*类型的参数填充到args中,并且需要ZEND_NUM_ARGS()作为参数。<br>
</p>
<p><br>
</p>
<p><br>
</p>
<p><strong>2. Arg info参数和类型的绑定</strong></p>
<p>这个arg info结构是ZE2才有的。每一个arg info声明都由一个ZEND_BEGIN_ARG_INFO()或ZEND_BEGIN_ARG_INFO_EX()宏组成,后面跟着0个或多个ZEND_ARG_*INFO(), 然后最后以ZEND_END_ARG_INFO()作为结尾。<br>
假定要重写count()函数:<br>
</p>
<p><pre class="code">PHP_FUNCTION(sample_count_array)
{
    zval *arr;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a",
                                    &arr) == FAILURE) {
        RETURN_NULL();
    }
    RETURN_LONG(zend_hash_num_elements(Z_ARRVAL_P(arr)));
}
ログイン後にコピー

zend_parse_parameters()会确保输入到你函数中的参数是一个数组。但是如果你需要用zend_get_parameter()的话,那么就需要自己在函数内部内建类型检查。除非使用类型绑定:

ZEND_BEGIN_ARG_INFO(php_sample_array_arginfo, 0)
         ZEND_ARG_ARRAY_INFO(0, "arr", 0)
     ZEND_END_ARG_INFO()
。。。     PHP_FE(sample_count_array, php_sample_array_arginfo)  。。。
ログイン後にコピー

通过这种方式,zend engine就会帮你进行类型检查了。同时还给了参数一个名字,从而使得产生的错误信息更加具有可读性。

而对于对象来说,也可以通过arg info进行限定:

ZEND_BEGIN_ARG_INFO(php_sample_class_arginfo, 0)
         ZEND_ARG_OBJECT_INFO(1, "obj", "stdClass", 0)
     ZEND_END_ARG_INFO()
ログイン後にコピー

这里第一个参数被设为1,表示是引用方式传递,但是对象其实在ZE2中都是引用传递的。不要忘记了array和object的allow_null选项。
如果使用的是php4的话,只能用PHP_TYPE_P()进行检查,或使用convert_to_type()方法进行类型转换。









www.bkjia.comtruehttp://www.bkjia.com/PHPjc/635059.htmlTechArticle之前的文章中,函数在接收的参数和返回的类型上都比较简单,但是往往实际中所遇到的都更加复杂一些。这篇文章主要说一下如何在php扩...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP の SNMP 拡張機能を使用するにはどうすればよいですか? PHP の SNMP 拡張機能を使用するにはどうすればよいですか? Jun 02, 2023 am 10:22 AM

PHP の SNMP 拡張機能は、PHP が SNMP プロトコルを介してネットワーク デバイスと通信できるようにする拡張機能です。この拡張機能を使用すると、CPU、メモリ、ネットワークインターフェイスなどのネットワークデバイスの構成情報やルータ、スイッチなどの情報を簡単に取得および変更できます。また、スイッチングデバイスのポートなどの制御操作も実行できます。この記事では、SNMP プロトコルの基本知識、PHP の SNMP 拡張機能をインストールする方法、PHP で SNMP 拡張機能を使用してネットワーク デバイスを監視および制御する方法を紹介します。 1.SN

最初から最後まで: PHP 拡張機能 cURL を使用して HTTP リクエストを行う方法 最初から最後まで: PHP 拡張機能 cURL を使用して HTTP リクエストを行う方法 Jul 29, 2023 pm 05:07 PM

最初から最後まで: HTTP リクエストに php 拡張機能 cURL を使用する方法 はじめに: Web 開発では、多くの場合、サードパーティ API または他のリモート サーバーと通信する必要があります。 cURL を使用して HTTP リクエストを行うのは、一般的で強力な方法です。この記事では、PHP を使用して cURL を拡張して HTTP リクエストを実行する方法を紹介し、いくつかの実用的なコード例を示します。 1. 準備 まず、php に cURL 拡張機能がインストールされていることを確認します。コマンドラインで php-m|grepcurl を実行して確認できます。

PHP と HTML の組み合わせ: コードを埋め込むための 3 つのテクニック PHP と HTML の組み合わせ: コードを埋め込むための 3 つのテクニック Mar 06, 2024 am 08:09 AM

PHP と HTML の組み合わせは、Web 開発における一般的なテクノロジです。PHP は、HTML ファイルに動的コンテンツを埋め込み、補助機能を実装することで、Web サイトの対話性とカスタマイズ性を大幅に向上させることができます。この記事では、コードを埋め込むための 3 つのテクニックを紹介し、参考として具体的なコード例を示します。 1. PHP タグを使用してコードを埋め込む 最も一般的な方法は、PHP タグ () を使用して PHP コードを HTML ファイルに埋め込み、動的コンテンツを表示することです。たとえば、PHP を使用できます。

PHP 関数の拡張機能とサードパーティ モジュール PHP 関数の拡張機能とサードパーティ モジュール Apr 13, 2024 pm 02:12 PM

PHP 関数の機能を拡張するには、拡張機能とサードパーティのモジュールを使用できます。拡張機能は、pecl パッケージ マネージャーを通じてインストールおよび有効化できる追加の関数とクラスを提供します。サードパーティ モジュールは特定の機能を提供し、Composer パッケージ マネージャーを通じてインストールできます。実際の例には、拡張機能を使用して複雑な JSON データを解析したり、モジュールを使用してデータを検証したりすることが含まれます。

CENTOS7でmbstring拡張機能をインストールするにはどうすればよいですか? CENTOS7でmbstring拡張機能をインストールするにはどうすればよいですか? Jan 06, 2024 pm 09:59 PM

1.UncaughtError:Calltoundependentfunctionmb_strlen(); 上記のエラーが発生した場合、mbstring 拡張機能がインストールされていないことを意味します; 2. PHP インストール ディレクトリ cd/temp001/php-7.1.0/ext/mbstring に入ります 3. phpize( /usr/local/bin /phpize または /usr/local/php7-abel001/bin/phpize) コマンドを使用して、php 拡張機能 4../configure--with-php-config=/usr/local/php7-abel をインストールします。

Aurora Push 拡張機能を使用して PHP アプリケーションにバッチ メッセージ プッシュ機能を実装する方法 Aurora Push 拡張機能を使用して PHP アプリケーションにバッチ メッセージ プッシュ機能を実装する方法 Jul 25, 2023 pm 08:07 PM

Aurora Push 拡張機能を使用して PHP アプリケーションにバッチ メッセージ プッシュ機能を実装する方法 モバイル アプリケーションの開発において、メッセージ プッシュは非常に重要な機能です。 Jiguang Push は、豊富な機能とインターフェイスを提供する、一般的に使用されるメッセージ プッシュ サービスです。この記事では、Aurora Push 拡張機能を使用して、PHP アプリケーションにバッチ メッセージ プッシュ機能を実装する方法を紹介します。ステップ 1: Jiguang Push アカウントを登録し、API キーを取得する まず、Jiguang Push の公式 Web サイト (https://www.jiguang.cn/push) に登録する必要があります。

PHP の ZipArchive 拡張機能を使用するにはどうすればよいですか? PHP の ZipArchive 拡張機能を使用するにはどうすればよいですか? Jun 02, 2023 am 08:13 AM

PHP は、Web アプリケーションの開発やファイルの処理に使用できる人気のあるサーバー側言語です。 PHP 用の ZipArchive 拡張機能は、PHP で zip ファイルを操作するための強力なツールです。この記事では、PHP の ZipArchive 拡張機能を使用して zip ファイルを作成、読み取り、変更する方法について説明します。 1. ZipArchive 拡張機能をインストールする ZipArchive 拡張機能を使用する前に、拡張機能がインストールされていることを確認する必要があります。インストール方法は以下のとおりです。 1. インストールします。

PHP の POSIX 拡張機能を使用するにはどうすればよいですか? PHP の POSIX 拡張機能を使用するにはどうすればよいですか? Jun 03, 2023 am 08:01 AM

PHP の POSIX 拡張機能は、PHP が POSIX 準拠のオペレーティング システムと対話できるようにする関数と定数のセットです。 POSIX (PortableOperatingSystemInterface) は、ソフトウェア開発者がさまざまな UNIX または UNIX 類似のオペレーティング システム上で実行できるアプリケーションを作成できるように設計された一連のオペレーティング システム インターフェイス標準です。この記事では、PHP 用の POSIX 拡張機能のインストールと使用方法を紹介します。 1. PHP の POSIX 拡張機能を次の場所にインストールします。

See all articles