Table des matières
1 . Sans paramètres, la fonction d'extension sans valeur de retour est écrite
2. Fonction d'extension sans paramètres et valeur de retour Écriture
3. Extension avec paramètres et aucune valeur de retour Écriture de fonction
4. Paramètres scalaires, fonctions d'extension avec valeurs de retour Écriture
5. Paramètres du tableau, écriture de la fonction d'extension avec valeur de retour
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

Apr 13, 2018 pm 04:20 PM
php nous

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
Copier après la connexion

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;
}
Copier après la connexion

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();
}
Copier après la connexion

Code de test PHP

<?php
//打印100以内的素数
mm_print_pn_100();
Copier après la connexion

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
Copier après la connexion

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.add<mm_sum_1_100>("mm_sum_1_100");
Copier après la connexion

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 类型
}
Copier après la connexion

Code de test PHP :

<?php
$sum = mm_sum_1_100();
echo &#39;sum (1~100) = &#39; . $sum . PHP_EOL;
?>
Copier après la connexion

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

sum (1~100) = 5050
Copier après la connexion

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.add<mm_print_pn_any>("mm_print_pn_any");
Copier après la connexion

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();    
}
Copier après la connexion

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);
?>
Copier après la connexion

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(&#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
Copier après la connexion

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");
Copier après la connexion

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;
}
Copier après la connexion

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;
?>
Copier après la connexion

Résultat de sortie du test :

sum (1,2,&#39;3&#39;,&#39;5&#39;) = 11
Copier après la connexion

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;
}
Copier après la connexion
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;
?>
Copier après la connexion
Résultat de sortie du test :

sum (array(1,3,5,7)) = 16
Copier après la connexion
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;
}
Copier après la connexion
Code de test PHP

<?php
$pn = mm_get_pn_30();
var_dump($pn);
?>
Copier après la connexion
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)
}
Copier après la connexion
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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

See all articles