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

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

藏色散人
藏色散人転載
2020-09-16 17:03:163618ブラウズ

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
を編集します。 <pre class="brush:php;toolbar:false">&lt;?php /** @generate-function-entries */ function all(array $arr): bool {} function any(array $arr): bool {}</pre>
python.stub.php
に基づいて python_arginfo.h を生成します。
php ../../build/gen_stub.php python.stub.php
関数ロジックを実装するには、python.c
を編集します。 <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>単体テストを作成し、
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--
03337722efea1711f56b8de85a57c3f3
--FILE--
9aca998af19012e49a0511600d6999f0
--EXPECT--
bool(true)
bool(true)
bool(true)
bool(true)
--TEST--
Check all function false case
--SKIPIF--
03337722efea1711f56b8de85a57c3f3
--FILE--
adcfae2c6b929629deb6b746091dd12c
--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 までご連絡ください。