Heim > Backend-Entwicklung > PHP-Tutorial > Entwicklung einer PHP-Erweiterung: Entwicklung unserer eigenen mathematischen Funktionsbibliothek

Entwicklung einer PHP-Erweiterung: Entwicklung unserer eigenen mathematischen Funktionsbibliothek

不言
Freigeben: 2023-03-23 18:32:01
Original
1728 Leute haben es durchsucht

Der Inhalt dieses Artikels besteht darin, die Entwicklung der PHP-Erweiterung und die Entwicklung unserer eigenen mathematischen Funktionsbibliothek mitzuteilen. Freunde in Not können sich darauf beziehen.

PHP-Erweiterung Ein fortgeschrittenes PHP-Programm. Eine der Fähigkeiten, die Entwickler verstehen müssen. Wie kann ein beginnender PHP-Erweiterungsentwickler eine ausgereifte Erweiterung entwickeln und in den fortgeschrittenen Bereich der PHP-Entwicklung einsteigen? Diese Reihe von Entwicklungs-Tutorials führt Sie Schritt für Schritt vom Einstieg in die fortgeschrittene Phase.
Diese Tutorialreihe wurde unter Linux entwickelt (Centos wird empfohlen), die PHP-Version ist 5.6 und es wird davon ausgegangen, dass Sie über bestimmte Linux-Betriebserfahrungen und C/C++-Grundlagen verfügen.
Wenn Sie Fragen haben und kommunizieren müssen, treten Sie bitte der technischen QQ-Austauschgruppe 32550793 bei, um mit mir zu kommunizieren.

Das vorherige Kapitel demonstrierte eine „Hello World“-Erweiterung. Jeder hat ein grundlegendes Verständnis des Grundstils des mit PHP-CPP entwickelten erweiterten C++-Quellcodes. Lassen Sie uns eine einfache Bibliothek für mathematische Operationen (mymath) entwickeln, um uns mit dem Exportieren verschiedener Schnittstellenfunktionen vertraut zu machen.
Der Code der mymath-Mathematikbibliothek wurde auf Github veröffentlicht. Sie können ihn direkt über Git herunterladen oder die Webseite in Ihrem Browser öffnen, um den Quellcode herunterzuladen.

Git-Download-Befehlszeile

git clone https://github.com/elvisszhang/phpcpp_mymath.git
Nach dem Login kopieren

Die Browser-Download-URL ist dieselbe wie die Warehouse-URL: https://github.com/elvisszhan...

1 . Ohne Parameter wird eine Erweiterungsfunktion ohne Rückgabewert geschrieben

Funktionsfunktion: Primzahlen innerhalb von 100 drucken

Funktionsname: mm_print_pn_100

So registrieren Sie die Erweiterungsfunktion

Erforderlich Registrieren Sie im Funktionskörper get_module die Funktion mm_print_pn_100, damit sie direkt in PHP aufgerufen werden kann.

PHPCPP_EXPORT void *get_module() 
{
        // 必须是static类型,因为扩展对象需要在PHP进程内常驻内存
        static Php::Extension extension("mymath", "1.0.0");
        
        //这里可以添加你要暴露给PHP调用的函数
        extension.add<mm_print_pn_100>("mm_print_pn_100");
        
        // 返回扩展对象指针
        return extension;
}
Nach dem Login kopieren

Die Funktionsdeklaration und der Code lauten wie folgt.
Die Funktion erfordert keine Parameter. Es ist nicht nötig, etwas in die Parameterliste der Funktion einzutragen, lassen Sie sie einfach leer. Die Funktion muss keinen Wert zurückgeben und der Rückgabewerttyp ist auf void gesetzt.

//打印100以内的素数
void mm_print_pn_100()
{
    int x = 2;
    int y = 1;
    int line = 0;
    while (x <= 100){
        int z = x - y; //z随y递减1
        int a = x%z; //取余数
        if (a == 0) { //如果x被z整除
            if (z == 1) {//如果z为1(x是质数)
                Php::out << x << " ";//输出x
                line ++;//每行输出的数的数量加1
             }
            x ++; //x加1
            y = 1;//y还原
        }
        else {//如果没有被整除
            y ++;//y加1,下一次循环中z减1
        }
        if (line == 10) {//每输出10个数 
            Php::out << std::endl;//输出一个换行        
            line = 0;//还原line
        }
    }
    if (line != 0) //最后一行输出换行
        Php::out << std::endl;
    Php::out.flush();
}
Nach dem Login kopieren

PHP-Testcode

<?php
//打印100以内的素数
mm_print_pn_100();
Nach dem Login kopieren

Führen Sie den obigen PHP-Code aus. Das Ausgabeergebnis ist

2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
Nach dem Login kopieren

2. Erweiterungsfunktion ohne Parameter und Rückgabewert Schreiben

Funktionsfunktion: Berechnen Sie die Summe von 1, 2, 3,...,100
Funktionsname: mm_sum_1_100

Registrieren Sie die Funktion mm_sum_1_100, die Registrierungsmethode ist die gleiche wie die vorherige Abschnitt

extension.add<mm_sum_1_100>("mm_sum_1_100");
Nach dem Login kopieren

Die Funktionsdeklaration und der Code lauten wie folgt.
Die Funktion erfordert keine Parameter, setzen Sie einfach die Funktionsparameterliste auf leer.
Die Funktion hat einen Rückgabewert und der Rückgabewerttyp ist auf PHP::Value festgelegt. Da Php::value den Konstruktor und den Operator = Operator überlastet, können gängige Datentypen (Ganzzahlen, Strings, Gleitkommazahlen, Arrays usw.) direkt zurückgegeben werden.

//获取1-100的和
Php::Value mm_sum_1_100()
{
    int sum = 0;
    int i;
    for(i=1;i<=100;i++){
        sum += i;
    }
    return sum; //可以直接返回sum值,自动生成 Php::value 类型
}
Nach dem Login kopieren

PHP-Testcode:

<?php
$sum = mm_sum_1_100();
echo &#39;sum (1~100) = &#39; . $sum . PHP_EOL;
?>
Nach dem Login kopieren

Führen Sie den obigen PHP-Code aus. Das Ausgabeergebnis ist

sum (1~100) = 5050
Nach dem Login kopieren

3. Erweiterung mit Parametern und ohne Rückgabewert Funktionsschreiben

Funktionsfunktion: Berechnen Sie eine beliebige Ganzzahl und drucken Sie alle Primzahlen innerhalb der Ganzzahl

Funktionsname: mm_print_pn_any

Registrieren Sie die Funktion mm_print_pn_any, die Registrierungsmethode ist die gleiche wie der vorherige Abschnitt

extension.add<mm_print_pn_any>("mm_print_pn_any");
Nach dem Login kopieren

Die Funktionsdeklaration und der Code lauten wie folgt. Da Parameter erforderlich sind, müssen die Funktionsparameter als Php::Parameters ¶ms geschrieben werden. Da es keinen Rückgabewert gibt, ist der Rückgabewerttyp auf void gesetzt.
Außerdem muss überprüft werden, ob die Parameter eingegeben werden, und der Typ der Parameter muss ebenfalls überprüft werden, ob es sich um eine Ganzzahl handelt. Bei direkter Verwendung ohne Erkennung ist der Code anfällig für Ausnahmen.

//任意给定一个整数,打印出小于等于该整数的所有素数
void mm_print_pn_any(Php::Parameters &params)
{
    //检查必须输入一个参数
    if(params.size() == 0){
        Php::out << "error: need a parameter " << std::endl;
        return;
    }
    //检查参数必须是整形
    if( params[0].type() != Php::Type::Numeric){
        Php::out << "error: parameter must be numeric" << std::endl;
        return;
    }
    //检查数字必须大于1
    int number = params[0];
    if(number <= 1){
        Php::out << "error: parameter must be larger than 1" << std::endl;
        return;
    }
    //检查参数必须大于0
    int x = 2;
    int y = 1;
    int line = 0;
    while (x <= number){
        int z = x - y; //z随y递减1
        int a = x%z; //取余数
        if (a == 0) { //如果x被z整除
            if (z == 1) {//如果z为1(x是质数)
                Php::out << x << " ";//输出x
                line ++;//每行输出的数的数量加1
             }
            x ++; //x加1
            y = 1;//y还原
        }
        else {//如果没有被整除
            y ++;//y加1,下一次循环中z减1
        }
        if (line == 10) {//每输出10个数
            Php::out << std::endl;//输出一个换行        
            line = 0;//还原line
        }
    }
    if (line != 0) //最后一行输出换行
        Php::out << std::endl;
    Php::out.flush();    
}
Nach dem Login kopieren

PHP-Testcode

<?php
echo &#39;---runing mm_print_pn_any()---&#39; . PHP_EOL;
mm_print_pn_any();

echo PHP_EOL . &#39;---runing mm_print_pn_any(\&#39;xyz\&#39;)---&#39; . PHP_EOL;
mm_print_pn_any(&#39;xyz&#39;);

echo PHP_EOL . &#39;---runing mm_print_pn_any(200)---&#39; . PHP_EOL;
mm_print_pn_any(200);
?>
Nach dem Login kopieren

Führen Sie den obigen PHP-Code aus. Das Ausgabeergebnis ist

---runing mm_print_pn_any()---
error: need a parameter

---runing mm_print_pn_any(&#39;xyz&#39;)---
error: parameter must be numeric

---runing mm_print_pn_any(200)---
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199
Nach dem Login kopieren

4. Skalare Parameter, Erweiterungsfunktionen mit Rückgabewerten Schreiben

Funktionsfunktion: Berechnen Sie anhand einer Reihe von Parametern deren Summe

Funktionsname: mm_sum_all

Registrieren Sie die Erweiterungsfunktion mm_sum_all. Die Registrierungsmethode ist dieselbe wie die vorherige Abschnitt

extension.add<mm_sum_all>("mm_sum_all");
Nach dem Login kopieren

Die Funktionsdeklaration und der Code lauten wie folgt.

//获取所有参数的和
Php::Value mm_sum_all(Php::Parameters &params)
{
    int sum = 0;
    for (auto &param : params){
        //字符串类型可以自动转换成整形
        sum += param;
    }
    return sum;
}
Nach dem Login kopieren

PHP-Testcode

<?php

$sum = mm_sum_all(1,2,&#39;3&#39;,&#39;5&#39;); //字符串类型可以自动转换成整形
echo &#39;sum (1,2,\&#39;3\&#39;,\&#39;5\&#39;) = &#39; . $sum . PHP_EOL;
?>
Nach dem Login kopieren

Testausgabeergebnis:

sum (1,2,&#39;3&#39;,&#39;5&#39;) = 11
Nach dem Login kopieren

5. Array-Parameter, Schreiben der Erweiterungsfunktion mit Rückgabewert

Funktionsfunktion: Berechnen Sie anhand eines Array-Typparameters die Summe aller Elemente des Arrays

Funktionsname: mm_sum_array

Registrieren Sie die Funktion mm_sum_array, die Registrierungsmethode ist dieselbe wie im ersten Abschnitt

Die Funktionsdeklaration und der Code lauten wie folgt.

//获取所有数组各元素的和
Php::Value mm_sum_array(Php::Parameters &params)
{
    //没有给定参数,返回0
    if(params.size() == 0){
        return 0;
    }
    //参数类型不是数组,转成整形返回
    if( params[0].type() != Php::Type::Array){
        return (int)params[0];
    }
    //数组中的元素逐个相加
    int sum = 0;
    Php::Value array = params[0];
    int size = array.size();
    int i;
    for(i=0;i<size;i++){
        sum += array.get(i);
    }
    return sum;
}
Nach dem Login kopieren

PHP-Testcode

<?php
$nums = array(1,3,5,7);
$sum = mm_sum_array($nums);
echo &#39;sum (array(1,3,5,7)) = &#39; . $sum . PHP_EOL;
?>
Nach dem Login kopieren

Testausgabeergebnis:

sum (array(1,3,5,7)) = 16
Nach dem Login kopieren

6. Erweiterungsfunktion schreiben, deren Rückgabewerttyp ein Array ist

< 🎜 Die Rückgabewerte der oben genannten Funktionen sind alle Skalartypen. Wenn Sie einen Array-Typ zurückgeben möchten, können Sie std::vector verwenden Konvertieren Sie es sorgfältig in ein Array, das PHP erkennt.

Die Funktion unserer aktuellen Demonstrationsfunktion besteht darin, „ein Array aller Primzahlen innerhalb von 30 zurückzugeben“. Die Methode zum Registrieren von Funktionen in der Erweiterung ist dieselbe wie im ersten Abschnitt.

Die Funktionsdeklaration und der Code lauten wie folgt.

//获取30以内的所有素数
Php::Value mm_get_pn_30()
{
    std::vector<int> pn;
    int x = 2;
    int y = 1;
    while (x <= 30){
        int z = x - y; //z随y递减1
        int a = x%z; //取余数
        if (a == 0) { //如果x被z整除
            if (z == 1) {//如果z为1(x是质数)
                pn.push_back(x); //放数组中去
            }
            x ++; //x加1
            y = 1;//y还原
        }
        else {//如果没有被整除
            y ++;//y加1,下一次循环中z减1
        }
    }    
    return pn;
}
Nach dem Login kopieren
PHP-Testcode

<?php
$pn = mm_get_pn_30();
var_dump($pn);
?>
Nach dem Login kopieren
Testausgabeergebnisse:

array(10) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  int(5)
  [3]=>
  int(7)
  [4]=>
  int(11)
  [5]=>
  int(13)
  [6]=>
  int(17)
  [7]=>
  int(19)
  [8]=>
  int(23)
  [9]=>
  int(29)
}
Nach dem Login kopieren
7. Referenzen

C++-Primzahlbestimmung und Ausgabeprime Zahlentabelle

PHP-CPP-Funktionsentwicklungshilfe

Verwandte Empfehlungen:

Vergleich und Einführung verwandter Entwicklungstechnologien für die PHP-Erweiterungsentwicklung

PHP-Erweiterungsentwicklung: Schreiben der ersten Erweiterung „Hallo Welt“


Das obige ist der detaillierte Inhalt vonEntwicklung einer PHP-Erweiterung: Entwicklung unserer eigenen mathematischen Funktionsbibliothek. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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