Maison > Article > développement back-end > Développement d'extensions PHP : développer notre propre bibliothèque de fonctions mathématiques
Le contenu de cet article est de partager avec vous le développement de l'extension PHP et le développement de notre propre bibliothèque de fonctions mathématiques. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer
L'extension PHP est. un programme PHP avancé. Une des compétences que les développeurs doivent comprendre. Pour un développeur d'extensions PHP débutant, comment peut-il développer une extension mature et entrer dans le domaine avancé du développement PHP ? Cette série de didacticiels de développement vous guidera étape par étape, de l'entrée aux étapes avancées.
Cette série de didacticiels est développée sous Linux (centos est recommandé), la version PHP est 5.6 et il est supposé que vous avez une certaine expérience d'exploitation Linux et des bases c/c++.
Si vous avez des questions et avez besoin de communiquer, veuillez rejoindre le groupe d'échange technique QQ 32550793 pour communiquer avec moi.
Le chapitre précédent a démontré une extension hello world. Tout le monde a une compréhension de base du style de base du code source C++ étendu développé avec PHP-CPP. Développons une bibliothèque d'opérations mathématiques simple (mymath) pour nous familiariser avec la façon d'exporter diverses fonctions d'interface.
Le code de la bibliothèque mathématique mymath a été placé sur github. Vous pouvez le télécharger directement depuis git ou ouvrir la page Web dans votre navigateur pour télécharger le code source.
Ligne de commande de téléchargement git
git clone https://github.com/elvisszhang/phpcpp_mymath.git
L'URL de téléchargement du navigateur est la même que l'URL de l'entrepôt : https://github.com/elvisszhan...
Fonction de fonction : imprimer les nombres premiers dans les 100
Nom de la fonction : mm_print_pn_100
Comment enregistrer la fonction d'extension.
Obligatoire Dans le corps de la fonction get_module, enregistrez la fonction mm_print_pn_100 afin qu'elle puisse être appelée directement en php.
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; }
La déclaration et le code de la fonction sont les suivants.
La fonction ne nécessite pas de paramètres. Il n'est pas nécessaire de mettre quoi que ce soit dans la liste des paramètres de la fonction, laissez-la simplement vide. La fonction n'a pas besoin de renvoyer de valeur et le type de valeur de retour est défini sur void.
//打印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(); }
Code de test PHP
<?php //打印100以内的素数 mm_print_pn_100();
Exécutez le code PHP ci-dessus, le résultat de sortie est
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
Fonction de fonction : Calculer la somme de 1, 2, 3,...,100
Nom de la fonction : mm_sum_1_100
Enregistrer la fonction mm_sum_1_100, la méthode d'enregistrement est la même que la précédente section
extension.add3f2a249f9aecb1d2a712d2cf71bb2afe("mm_sum_1_100");
La déclaration et le code de la fonction sont les suivants.
La fonction ne nécessite pas de paramètres, il suffit de définir la liste des paramètres de la fonction sur vide.
La fonction a une valeur de retour et le type de valeur de retour est défini sur Php::Value. Puisque Php::value surcharge le constructeur et l'opérateur Operator =, les types de données courants (entiers, chaînes, nombres à virgule flottante, tableaux, etc.) peuvent être renvoyés directement.
//获取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 类型 }
Code de test PHP :
<?php $sum = mm_sum_1_100(); echo 'sum (1~100) = ' . $sum . PHP_EOL; ?>
Exécutez le code PHP ci-dessus, le résultat de sortie est
sum (1~100) = 5050
Fonction de fonction : calculer n'importe quel entier donné et imprimer tous les nombres premiers dans l'entier
Nom de la fonction : mm_print_pn_any
Fonction d'enregistrement mm_print_pn_any, la méthode d'enregistrement est la même que la section précédente
extension.add6d3e5fed0b3653f4cbf5967b8682fbe8("mm_print_pn_any");
La déclaration et le code de la fonction sont les suivants. Puisque les paramètres sont requis, les paramètres de la fonction doivent être écrits sous la forme Php::Parameters ¶ms. Puisqu'il n'y a pas de valeur de retour, le type de valeur de retour est défini sur void.
De plus, il est nécessaire de vérifier si les paramètres sont saisis, et le type des paramètres doit également être vérifié s'il s'agit d'un nombre entier. S'il est utilisé directement sans détection, le code est sujet à des exceptions.
//任意给定一个整数,打印出小于等于该整数的所有素数 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(); }
Code de test PHP
<?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); ?>
Exécutez le code PHP ci-dessus, le résultat de sortie est
---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
Fonction de fonction : Étant donné une série de paramètres, calculer leur somme
Nom de la fonction : mm_sum_all
Enregistrer la fonction d'extension mm_sum_all, la méthode d'enregistrement est la même que la précédente section
extension.add<mm_sum_all>("mm_sum_all");
La déclaration et le code de la fonction sont les suivants.
//获取所有参数的和 Php::Value mm_sum_all(Php::Parameters ¶ms) { int sum = 0; for (auto ¶m : params){ //字符串类型可以自动转换成整形 sum += param; } return sum; }
Code de test PHP
<?php $sum = mm_sum_all(1,2,'3','5'); //字符串类型可以自动转换成整形 echo 'sum (1,2,\'3\',\'5\') = ' . $sum . PHP_EOL; ?>
Résultat de sortie du test :
sum (1,2,'3','5') = 11
//获取所有数组各元素的和 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; }Code de test PHP
<?php $nums = array(1,3,5,7); $sum = mm_sum_array($nums); echo 'sum (array(1,3,5,7)) = ' . $sum . PHP_EOL; ?>Résultat de sortie du test :
sum (array(1,3,5,7)) = 166. Écriture de la fonction d'extension dont le type de valeur de retour est un tableau
//获取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; }Code de test PHP
<?php $pn = mm_get_pn_30(); var_dump($pn); ?>Résultat de sortie du test :
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) }7. RéférencesDétermination des nombres premiers C++ et nombres premiers Tableau de sortie
Aide au développement de fonctions PHP-CPP
Comparaison et introduction des technologies de développement associées pour le développement d'extensions PHP
Développement d'extension PHP : écriture de la première extension hello world
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!