Heim > Backend-Entwicklung > PHP8 > Hauptteil

Erste Erfahrungen mit dem erweiterten Arginfo-Generierungstool von PHP8

藏色散人
Freigeben: 2023-02-17 11:40:01
nach vorne
3615 Leute haben es durchsucht

php8 bietet ein sehr praktisches Tool zum Generieren von Erweiterungsfunktions- oder Klassenparameterinformationen.

Sie müssen lediglich eine Kopie von xyz.stub.php pflegen und können Tools verwenden, um xyz_arginfo.h zu generieren. xyz.stub.php,就可以使用工具生成 xyz_arginfo.h

毫无疑问,这种方式,又降低了广大 phper 开发扩展的门槛,更易维护。

上手体验:

生成扩展骨架。

cd ext
php ext_skel.php --ext test
Nach dem Login kopieren

随便添加一个函数,更改 test.stub.php

<?php

/** @generate-function-entries */

function test1(): void {}

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

function test3(int $integer = 123): int {}
Nach dem Login kopieren

重新生成 test_arginfo.h

php ../../build/gen_stub.php test.stub.php
Nach dem Login kopieren

相关 commit 可以 点击这儿(https://github.com/php/php-src/compare/master...nikic:php-stubs)

写个简单的扩展举例,通过php扩展的方式来实现python中的allany函数。

准备工作。
  • 下载php最新源码
  • 已经安装好php
生成扩展骨架。
cd ext
php ext_skel.php --ext python
Nach dem Login kopieren
撰写函数原型,编辑 python.stub.php
<?php

/** @generate-function-entries */

function all(array $arr): bool {}

function any(array $arr): bool {}
Nach dem Login kopieren
根据 python.stub.php 生成 python_arginfo.h
php ../../build/gen_stub.php python.stub.php
Nach dem Login kopieren
实现函数逻辑,编辑 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);
}
Nach dem Login kopieren
编写单元测试,编辑 002.phpt003.phpt, 新建 004.phpt005.phpt
Es besteht kein Zweifel, dass diese Methode die Schwelle für die Entwicklung von Erweiterungen für phper senkt und die Wartung erleichtert. Erste Schritte: Erweitertes Skelett erstellen.
--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)
Nach dem Login kopieren
Funktion hinzufügen und test.stub.php ändern.
--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)
Nach dem Login kopieren
test_arginfo.h. php ../../build/gen_stub.php test.stub.php" title="" data-original-title="Copy">
--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)
Nach dem Login kopieren
Verwandte Commits können hier angeklickt werden (https://github.com/php /php-src/compare/master...nikic:php-stubs)

Schreiben Sie ein einfaches Erweiterungsbeispiel, um all und any< zu implementieren in Python über PHP-Erweiterung. </p><span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="extension=python.so" title="" data-original-title="复制">Vorbereitung code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="cd ext php ext_skel.php --ext python" title="" data-original-title="Copy"></span><div class="code" style="position:relative; padding:0px; margin:0px;"><pre id="coder" class="brush:php;toolbar:false">--TEST-- Check all function false case --SKIPIF-- &lt;?php if (!extension_loaded(&amp;#39;python&amp;#39;)) { echo &amp;#39;skip&amp;#39;; } ?&gt; --FILE-- &lt;?php var_dump(any([&amp;#39;0&amp;#39;])); var_dump(any([0])); var_dump(any([&amp;#39;&amp;#39;])); var_dump(any([false])); var_dump(any([0, &amp;#39;0&amp;#39;, &amp;#39;&amp;#39;, false])); ?&gt; --EXPECT-- bool(false) bool(false) bool(false) bool(false) bool(false)</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>Schreiben Sie den Funktionsprototyp und bearbeiten Sie <code>python.stub.php.

./configure && make
make test
sudo make install
Nach dem Login kopieren
Gemäß python.stub.php generiert python_arginfo.h
php -i | grep ini # 定位你的php.ini文件
Nach dem Login kopieren
Funktionslogik implementieren, bearbeiten python.c.
extension=python.so
Nach dem Login kopieren
Schreiben Sie Unit-Tests, bearbeiten Sie 002.phpt und 003.phpt und erstellen Sie einen neuen 004. phpt</code > und <code>005.phpt

php -m | grep python
Nach dem Login kopieren
🎜Eigentlicher Test 🎜🎜🎜
php -r "var_dump(all([]));“
php -r "var_dump(any([]));"
Nach dem Login kopieren
🎜PHP8 hat viele nützliche Makros und Funktionen hinzugefügt 🎜🎜.

Das obige ist der detaillierte Inhalt vonErste Erfahrungen mit dem erweiterten Arginfo-Generierungstool von PHP8. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!