ホームページ > バックエンド開発 > PHP8 > php8 の拡張 arginfo 生成ツールを初めて使用してみた

php8 の拡張 arginfo 生成ツールを初めて使用してみた

藏色散人
リリース: 2023-02-17 11:40:01
転載
3687 人が閲覧しました

php8 は、拡張関数またはクラスのパラメーター情報を生成するための非常に便利なツールを提供します。

xyz.stub.php のコピーを保持するだけでよく、ツールを使用して xyz_arginfo.h を生成できます。

この方法により、phper の開発と拡張の敷居が下がり、メンテナンスが容易になることは間違いありません。

入門エクスペリエンス:

拡張スケルトンを生成します。

cd ext
php ext_skel.php --ext test
ログイン後にコピー

関数を追加し、test.stub.php を変更します。

<?php

/** @generate-function-entries */

function test1(): void {}

function test2(string $str = ""): string {}

function test3(int $integer = 123): int {}
ログイン後にコピー

test_arginfo.h を再生成します。

php ../../build/gen_stub.php test.stub.php
ログイン後にコピー

関連するコミットはここをクリックしてください (https://github.com/php/php-src/compare/master...nikic:php- stubs )

PHP 拡張機能を介して Python で all 関数と any 関数を実装するための簡単な拡張機能の例を作成します。 ######準備。

phpの最新のソースコードをダウンロード
  • すでにインストールされているphp
  • 拡張スケルトンを生成します。
cd ext
php ext_skel.php --ext python
ログイン後にコピー
関数プロトタイプを作成し、python.stub.php
を編集します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php /** @generate-function-entries */ function all(array $arr): bool {} function any(array $arr): bool {}</pre><div class="contentsignin">ログイン後にコピー</div></div>
python.stub.php
に基づいて python_arginfo.h を生成します。
php ../../build/gen_stub.php python.stub.php
ログイン後にコピー
関数ロジックを実装するには、python.c
を編集します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">PHP_FUNCTION(all) { zval *input; zval *item; int result = 1, item_result = 1; HashTable *htbl; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_ARRAY(input) ZEND_PARSE_PARAMETERS_END(); htbl = Z_ARRVAL_P(input); ZEND_HASH_FOREACH_VAL(htbl, item) { item_result = zend_is_true(item); result &amp;= item_result; } ZEND_HASH_FOREACH_END(); RETURN_BOOL(result); } /* {{{ void any() */ PHP_FUNCTION(any) { zval *input; zval *item; int result = 0, item_result = 0; HashTable *htbl; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_ARRAY(input) ZEND_PARSE_PARAMETERS_END(); htbl = Z_ARRVAL_P(input); ZEND_HASH_FOREACH_VAL(htbl, item) { item_result = zend_is_true(item); result |= item_result; } ZEND_HASH_FOREACH_END(); RETURN_BOOL(result); }</pre><div class="contentsignin">ログイン後にコピー</div></div>単体テストを作成し、
002.phpt
003.phpt を編集し、新しい 004.phpt005.phpt を作成します。 ###。
--TEST--
Check all function true case
--SKIPIF--
<?php
if (!extension_loaded(&#39;python&#39;)) {
    echo &#39;skip&#39;;
}
?>
--FILE--
<?php
var_dump(all([]));
var_dump(all([1]));
var_dump(all([-1, 1, &#39;1&#39;]));
?>
--EXPECT--
bool(true)
bool(true)
bool(true)
ログイン後にコピー
--TEST--
Check all function false case
--SKIPIF--
<?php
if (!extension_loaded(&#39;python&#39;)) {
    echo &#39;skip&#39;;
}
?>
--FILE--
<?php
var_dump(all([&#39;0&#39;]));
var_dump(all([0]));
var_dump(all([&#39;&#39;]));
var_dump(all([false]));
var_dump(all([1, -1, 100, false]));
var_dump(all([0, -1, 100, 1]));
var_dump(all([&#39;1&#39;, -1, &#39;&#39;, 100, 1]));
?>
--EXPECT--
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
ログイン後にコピー
--TEST--
Check any function true case
--SKIPIF--
<?php
if (!extension_loaded(&#39;python&#39;)) {
    echo &#39;skip&#39;;
}
?>
--FILE--
<?php
var_dump(any([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]));
var_dump(any([[&#39;a&#39;, &#39;b&#39;, &#39;&#39;, &#39;d&#39;]]));
var_dump(any([[&#39;&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]]));
var_dump(any([[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;&#39;]]));
?>
--EXPECT--
bool(true)
bool(true)
bool(true)
bool(true)
ログイン後にコピー
--TEST--
Check all function false case
--SKIPIF--
<?php
if (!extension_loaded(&#39;python&#39;)) {
    echo &#39;skip&#39;;
}
?>
--FILE--
<?php
var_dump(any([&#39;0&#39;]));
var_dump(any([0]));
var_dump(any([&#39;&#39;]));
var_dump(any([false]));
var_dump(any([0, &#39;0&#39;, &#39;&#39;, false]));
?>
--EXPECT--
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
ログイン後にコピー
コンパイル、テスト、インストール
./configure && make
make test
sudo make install
ログイン後にコピー
php.iniに追加
php -i | grep ini # 定位你的php.ini文件
ログイン後にコピー
参加

extension=python.so
ログイン後にコピー

成功したかどうかを確認

php -m | grep python
ログイン後にコピー

実際のテスト
php -r "var_dump(all([]));“
php -r "var_dump(any([]));"
ログイン後にコピー
PHP8 には、多くの便利なマクロと機能が追加されています。

以上がphp8 の拡張 arginfo 生成ツールを初めて使用してみたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート