PHP 拡張機能の開発: 独自の数学関数ライブラリの開発

不言
リリース: 2023-03-23 18:32:01
オリジナル
1681 人が閲覧しました

この記事の内容は、PHP 拡張機能の開発と独自の数学関数ライブラリの開発を共有することです。必要な友人はそれを参照できます。

PHP 拡張機能は高度なスキルの 1 つです。 PHP プログラマーは、まず、初心者の PHP 拡張機能開発者が、どのようにして成熟した拡張機能を開発し、PHP 開発の高度な分野に参入できるのかを理解する必要があります。この一連の開発チュートリアルでは、入門段階から上級段階まで段階的に説明します。
このチュートリアル シリーズは Linux (centos を推奨) で開発されており、PHP バージョンは 5.6 で、一定の Linux 操作経験と C/C++ の基礎があることを前提としています。
ご質問があり、連絡する必要がある場合は、QQ 技術交換グループ 32550793 に参加して私と連絡してください。

前の章では、Hello World 拡張機能について説明しました。PHP-CPP で開発された拡張 C++ ソース コードの基本的なスタイルについては、誰もが基本的に理解しています。さまざまなインターフェイス関数をエクスポートする方法に慣れるために、単純な数学演算ライブラリ (mymath) を開発しましょう。
mymath 数学ライブラリのコードは github に配置されています。git 経由で直接ダウンロードすることも、ブラウザで Web ページを開いてソース コードをダウンロードすることもできます。

git ダウンロードコマンドライン

git clone https://github.com/elvisszhang/phpcpp_mymath.git
ログイン後にコピー

ブラウザのダウンロード URL はウェアハウスの URL と同じです: https://github.com/elvisszhan...

1. パラメーターなし、戻り値なしの拡張関数の書き方

関数関数:100以内の素数を出力

関数名:mm_print_pn_100

拡張関数の登録方法

phpで直接呼び出せるように、関数mm_print_pn_100をget_module関数本体に登録する必要があります。

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;
}
ログイン後にコピー

関数の宣言とコードは以下の通りです。
関数にはパラメータは必要ありません。関数のパラメータリストに何も入れる必要はなく、空のままにしておきます。この関数は値を返す必要はなく、戻り値の型は 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();
}
ログイン後にコピー

PHPテストコード

<?php
//打印100以内的素数
mm_print_pn_100();
ログイン後にコピー

上記のPHPコードを実行すると、出力結果は

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になります。 パラメータと戻り値なしの拡張関数の書き方

Function関数: 1、2、3、...を計算します。 , 100 合計
関数名: mm_sum_1_100

関数mm_sum_1_100を登録、登録方法は前項と同じです

extension.add<mm_sum_1_100>("mm_sum_1_100");
ログイン後にコピー

関数の宣言とコードは以下の通りです。
関数にはパラメータは必要ありません。関数パラメータリストを空に設定するだけです。
関数には戻り値があり、戻り値の型は Php::Value に設定されます。 Php::value はコンストラクターと演算子 = 演算子をオーバーロードするため、一般的なデータ型 (整数、文字列、浮動小数点数、配列など) を直接返すことができます。

//获取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 テストコード:

<?php
$sum = mm_sum_1_100();
echo &#39;sum (1~100) = &#39; . $sum . PHP_EOL;
?>
ログイン後にコピー

上記の PHP コードを実行すると、出力結果は

sum (1~100) = 5050
ログイン後にコピー

3 になります。パラメーター付きで戻り値なしの拡張関数の書き方

関数関数: 指定された整数を計算し、値を出力します。整数内の全ての素数

関数名: mm_print_pn_any

関数mm_print_pn_anyを登録、登録方法は前項と同じです

extension.add<mm_print_pn_any>("mm_print_pn_any");
ログイン後にコピー

関数の宣言とコードは以下の通りです。パラメータが必要なため、関数パラメータは Php::Parameters ¶ms として記述する必要があります。戻り値がないため、戻り値の型は void に設定されます。
さらに、パラメータが入力されているかどうかを確認する必要があり、パラメータの種類がプラスチックであるかどうかも確認する必要があります。検出せずに直接使用すると、コードで例外が発生する可能性があります。

//任意给定一个整数,打印出小于等于该整数的所有素数
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();    
}
ログイン後にコピー

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);
?>
ログイン後にコピー

上記のPHPコードを実行すると、出力結果は

---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
ログイン後にコピー

4になります。スカラーパラメータ、戻り値付きの拡張関数の記述

関数関数: 一連のパラメータを指定して、それらの合計を計算します

関数名前:mm_sum_all

拡張関数mm_sum_allを登録します。登録方法は前項と同じです

extension.add<mm_sum_all>("mm_sum_all");
ログイン後にコピー

関数の宣言とコードは以下の通りです。

//获取所有参数的和
Php::Value mm_sum_all(Php::Parameters &params)
{
    int sum = 0;
    for (auto &param : params){
        //字符串类型可以自动转换成整形
        sum += param;
    }
    return sum;
}
ログイン後にコピー

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;
?>
ログイン後にコピー

テスト出力結果:

sum (1,2,&#39;3&#39;,&#39;5&#39;) = 11
ログイン後にコピー

5.配列型パラメータ、戻り値付き拡張関数の書き込み

関数関数:配列型パラメータを与えて、配列の全要素の合計を計算します

関数名: mm_sum_array

関数 mm_sum_array を登録します、登録方法は最初のセクションと同じです

関数の宣言とコードは次のとおりです。

//获取所有数组各元素的和
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;
}
ログイン後にコピー

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;
?>
ログイン後にコピー

テスト出力結果:

sum (array(1,3,5,7)) = 16
ログイン後にコピー

6.戻り値の型は配列の拡張関数です

上記関数の戻り値はスカラー型で、配列は特に一般的なものですPHP で使用される型を返したい場合は、C++ の std::vector を使用できます。PHP-CPP は、それを PHP が認識する配列型に変換します。

現在のデモ関数の機能は、「30 以内のすべての素数の配列を返す」です。拡張機能に関数を登録する方法は最初のセクションと同じです。

関数の宣言とコードは以下の通りです。

//获取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 テストコード

<?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)
}
ログイン後にコピー

VII.参考資料

C++ 素数決定と出力素数テーブル
PHP-CPP 関数開発ヘルプ

関連する推奨事項:

PHP 拡張機能の関連開発開発 技術的な比較と紹介

PHP 拡張機能の開発: 最初の拡張機能 hello world の作成


以上がPHP 拡張機能の開発: 独自の数学関数ライブラリの開発の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート