Home > Backend Development > PHP8 > body text

First experience using php8's extended arginfo generation tool

藏色散人
Release: 2023-02-17 11:40:01
forward
3634 people have browsed it

php8 provides a very convenient tool for generating extension function or class parameter information.

You only need to maintain a copy of xyz.stub.php, and you can use tools to generate xyz_arginfo.h.

There is no doubt that this method lowers the threshold for the development and extension of phper and makes it easier to maintain.

Get started experience:

Generate extended skeleton.

cd ext
php ext_skel.php --ext test
Copy after login

Add a function and change test.stub.php.

<?php

/** @generate-function-entries */

function test1(): void {}

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

function test3(int $integer = 123): int {}
Copy after login

Regenerate test_arginfo.h.

                 
php ../../build/gen_stub.php test.stub.php
Copy after login

Related commits can be clicked here (https://github.com/php/php-src/compare/master...nikic:php-stubs )

Write a simple extension example to implement the all and any functions in python through PHP extension.

Preparation.
  • Download the latest source code of php
  • Already installed php
Generate the extended skeleton.
cd ext
php ext_skel.php --ext python
Copy after login
Write the function prototype and edit python.stub.php.
<?php

/** @generate-function-entries */

function all(array $arr): bool {}

function any(array $arr): bool {}
Copy after login
Generate python_arginfo.h based on python.stub.php.
php ../../build/gen_stub.php python.stub.php
Copy after login
To implement function logic, edit python.c.
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);
}
Copy after login
Write unit tests, edit 002.phpt and 003.phpt, create new 004.phpt and 005.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)
Copy after login
--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)
Copy after login
--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)
Copy after login
--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)
Copy after login
Compile, test and install
./configure && make
make test
sudo make install
Copy after login
Add to php.ini
php -i | grep ini # 定位你的php.ini文件
Copy after login

Join

extension=python.so
Copy after login

Check if successful

php -m | grep python
Copy after login
Actual test
php -r "var_dump(all([]));“
php -r "var_dump(any([]));"
Copy after login

PHP8 has added a lot of useful macros and features.

The above is the detailed content of First experience using php8's extended arginfo generation tool. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:segmentfault.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template