PHP 拡張機能と埋め込み -- PHP 拡張機能のパラメーター_PHP チュートリアル
これまでの記事では、関数は受け取るパラメーターと返す型の点で比較的単純ですが、実際にはより複雑になることがよくあります。この記事では主に、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; }
複合型の場合は、単純な zval* 型が使用されることに注意してください。これは、複合型を返すときに RETURN_* がない理由と同じです。 ZPP が行うことは、受信した zval* が正しいタイプであることを確認することです。必要に応じて、配列を stdClass オブジェクトに変換するなど、暗黙的な変換も実行します。
s 型の場合、これは非常に特殊で、1 つの char* 1 つの int です。これは主に、PHP の文字列の特殊な構造によるものです。
function sample_hello_world($name) { echo "Hello $name!\n"; }
複数のパラメータがある場合、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"); }
C の解釈にも同様の実装があります。 れーれー
オプションのパラメータは通常、指定されない限り値を持たないため、デフォルトのパラメータを指定することが重要です。ほとんどの場合、NULL/0 です
IS_NULL VS NULL: 各 zval 型は、最も単純な IS_NULL 型であっても、一定量のメモリ領域を占有します。また、それらの適用と解放にも時間がかかります。したがって、多くの場合、このタイプを使用する必要はありません。次の 2 つのコードで比較が行われます。
りー
強制分離:
変数が関数に渡されるとき、参照によって渡されるかどうかに関係なく、refcount は常に少なくとも 2 になります。1 つはそれ自体であり、もう 1 つは関数に渡されるコピーです。この zval を変更する前に、参照されていないコレクションからそれを分離する必要があります。
この機能は NULL フラグと同じであり、必要な場合にのみ使用されます。
古いバージョンの PHP と互換性を持たせたい場合、またはパラメータを受信するためのキャリアとして zval を使用したいだけの場合は、zend_get_parameters() 関数を使用してパラメータを受信することを検討できます
zend_parse_parameters() と比較すると、解析せずに直接取得されます。型変換は自動的には実行されません。拡張実装のすべてのパラメーターのキャリアは zval です。
リーリー
同時に、受信が失敗してもエラーをスローしません。また、デフォルト値を持つパラメーターを処理することもできません。解析との最後の違いは、コピーオンライトに準拠するすべての 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()方法进行类型转换。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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