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
Die Browser-Download-URL ist dieselbe wie die Warehouse-URL: https://github.com/elvisszhan...
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; }
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(); }
PHP-Testcode
<?php //打印100以内的素数 mm_print_pn_100();
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
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");
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 类型 }
PHP-Testcode:
<?php $sum = mm_sum_1_100(); echo 'sum (1~100) = ' . $sum . PHP_EOL; ?>
Führen Sie den obigen PHP-Code aus. Das Ausgabeergebnis ist
sum (1~100) = 5050
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");
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 ¶ms) { //检查必须输入一个参数 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(); }
PHP-Testcode
<?php echo '---runing mm_print_pn_any()---' . PHP_EOL; mm_print_pn_any(); echo PHP_EOL . '---runing mm_print_pn_any(\'xyz\')---' . PHP_EOL; mm_print_pn_any('xyz'); echo PHP_EOL . '---runing mm_print_pn_any(200)---' . PHP_EOL; mm_print_pn_any(200); ?>
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('xyz')--- 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
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");
Die Funktionsdeklaration und der Code lauten wie folgt.
//获取所有参数的和 Php::Value mm_sum_all(Php::Parameters ¶ms) { int sum = 0; for (auto ¶m : params){ //字符串类型可以自动转换成整形 sum += param; } return sum; }
PHP-Testcode
<?php $sum = mm_sum_all(1,2,'3','5'); //字符串类型可以自动转换成整形 echo 'sum (1,2,\'3\',\'5\') = ' . $sum . PHP_EOL; ?>
Testausgabeergebnis:
sum (1,2,'3','5') = 11
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 ¶ms) { //没有给定参数,返回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; }
PHP-Testcode
<?php $nums = array(1,3,5,7); $sum = mm_sum_array($nums); echo 'sum (array(1,3,5,7)) = ' . $sum . PHP_EOL; ?>
Testausgabeergebnis:
sum (array(1,3,5,7)) = 16
//获取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; }
<?php $pn = mm_get_pn_30(); var_dump($pn); ?>
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) }
PHP-CPP-Funktionsentwicklungshilfe
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!