Maison >développement back-end >tutoriel php >Développement d'extensions PHP : développer notre propre bibliothèque de fonctions mathématiques

Développement d'extensions PHP : développer notre propre bibliothèque de fonctions mathématiques

不言
不言original
2018-04-13 16:20:171714parcourir

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...

1 . Sans paramètres, la fonction d'extension sans valeur de retour est écrite

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

2. Fonction d'extension sans paramètres et valeur de retour Écriture

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 &#39;sum (1~100) = &#39; . $sum . PHP_EOL;
?>

Exécutez le code PHP ci-dessus, le résultat de sortie est

sum (1~100) = 5050

3. Extension avec paramètres et aucune valeur de retour Écriture de fonction

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 &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();    
}

Code de test PHP

<?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);
?>

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

4. Paramètres scalaires, fonctions d'extension avec valeurs de retour Écriture

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 &params)
{
    int sum = 0;
    for (auto &param : params){
        //字符串类型可以自动转换成整形
        sum += param;
    }
    return sum;
}

Code de test PHP

<?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;
?>

Résultat de sortie du test :

sum (1,2,'3','5') = 11

5. Paramètres du tableau, écriture de la fonction d'extension avec valeur de retour

Fonction de fonction : Étant donné un paramètre de type tableau, calculez la somme de tous les éléments du tableau

Nom de la fonction : mm_sum_array

Fonction d'enregistrement mm_sum_array, la méthode d'enregistrement est la même que la première section

La déclaration et le code de la fonction sont les suivants.

//获取所有数组各元素的和
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;
}
Code de test PHP

<?php
$nums = array(1,3,5,7);
$sum = mm_sum_array($nums);
echo &#39;sum (array(1,3,5,7)) = &#39; . $sum . PHP_EOL;
?>
Résultat de sortie du test :

sum (array(1,3,5,7)) = 16
6. Écriture de la fonction d'extension dont le type de valeur de retour est un tableau

Les valeurs de retour​​des fonctions ci-dessus sont toutes de type scalaire. Les tableaux sont un type particulièrement couramment utilisé en PHP. Si vous souhaitez renvoyer un type de tableau, vous pouvez utiliser std::vector de C++. le convertira judicieusement en un tableau reconnu par le type PHP.

La fonction de notre fonction de démonstration actuelle est de "retourner un tableau de tous les nombres premiers dans les 30". La méthode d'enregistrement des fonctions dans l'extension est la même que dans la première section.

La déclaration et le code de la fonction sont les suivants.

//获取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érences

Détermination des nombres premiers C++ et nombres premiers Tableau de sortie

Aide au développement de fonctions PHP-CPP

Recommandations associées :

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn