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
ログイン後にコピー
を編集します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?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
ログイン後にコピー
を編集します。 <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 &= 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.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--
<?php
if (!extension_loaded('python')) {
echo 'skip';
}
?>
--FILE--
<?php
var_dump(any(['a', 'b', 'c', 'd']));
var_dump(any([['a', 'b', '', 'd']]));
var_dump(any([['', 'b', 'c', 'd']]));
var_dump(any([['a', 'b', 'c', '']]));
?>
--EXPECT--
bool(true)
bool(true)
bool(true)
bool(true)
ログイン後にコピー
--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-- <?php if (!extension_loaded('python')) { echo 'skip'; } ?> --FILE-- <?php var_dump(any(['a', 'b', 'c', 'd'])); var_dump(any([['a', 'b', '', 'd']])); var_dump(any([['', 'b', 'c', 'd']])); var_dump(any([['a', 'b', 'c', '']])); ?> --EXPECT-- bool(true) bool(true) bool(true) bool(true)
ログイン後にコピー
--TEST-- Check all function false case --SKIPIF-- <?php if (!extension_loaded('python')) { echo 'skip'; } ?> --FILE-- <?php var_dump(any(['0'])); var_dump(any([0])); var_dump(any([''])); var_dump(any([false])); var_dump(any([0, '0', '', false])); ?> --EXPECT-- bool(false) bool(false) bool(false) bool(false) bool(false)
ログイン後にコピー
./configure && make
make test
sudo make install
ログイン後にコピー
php.iniに追加 ./configure && make make test sudo make install
ログイン後にコピー
php -i | grep ini # 定位你的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 には、多くの便利なマクロと機能が追加されています。
php -r "var_dump(all([]));“ php -r "var_dump(any([]));"
ログイン後にコピー