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
- 拡張スケルトンを生成します。
cd ext php ext_skel.php --ext python関数プロトタイプを作成し、python.stub.php
を編集します。 <pre class="brush:php;toolbar:false"><?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 &= 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.phpt
と 005.phpt を作成します。 ###。
--TEST--
Check all function true case
--SKIPIF--
<?php
if (!extension_loaded('python')) {
echo 'skip';
}
?>
--FILE--
<?php
var_dump(all([]));
var_dump(all([1]));
var_dump(all([-1, 1, '1']));
?>
--EXPECT--
bool(true)
bool(true)
bool(true)
--TEST--
Check all function false case
--SKIPIF--
<?php
if (!extension_loaded('python')) {
echo 'skip';
}
?>
--FILE--
<?php
var_dump(all(['0']));
var_dump(all([0]));
var_dump(all(['']));
var_dump(all([false]));
var_dump(all([1, -1, 100, false]));
var_dump(all([0, -1, 100, 1]));
var_dump(all(['1', -1, '', 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実際のテスト