この記事の内容は、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...
関数関数: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
Function関数: 1、2、3、...を計算します。 , 100 合計
関数名: mm_sum_1_100
関数mm_sum_1_100を登録、登録方法は前項と同じです
extension.add3f2a249f9aecb1d2a712d2cf71bb2afe("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 'sum (1~100) = ' . $sum . PHP_EOL; ?>
上記の PHP コードを実行すると、出力結果は
sum (1~100) = 5050
関数関数: 指定された整数を計算し、値を出力します。整数内の全ての素数
関数名: mm_print_pn_any
関数mm_print_pn_anyを登録、登録方法は前項と同じです
extension.add6d3e5fed0b3653f4cbf5967b8682fbe8("mm_print_pn_any");
関数の宣言とコードは以下の通りです。パラメータが必要なため、関数パラメータは Php::Parameters ¶ms として記述する必要があります。戻り値がないため、戻り値の型は void に設定されます。
さらに、パラメータが入力されているかどうかを確認する必要があり、パラメータの種類がプラスチックであるかどうかも確認する必要があります。検出せずに直接使用すると、コードで例外が発生する可能性があります。
//任意给定一个整数,打印出小于等于该整数的所有素数 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テストコード
<?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); ?>
上記のPHPコードを実行すると、出力結果は
---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
関数関数: 一連のパラメータを指定して、それらの合計を計算します
関数名前:mm_sum_all
拡張関数mm_sum_allを登録します。登録方法は前項と同じです
extension.add<mm_sum_all>("mm_sum_all");
関数の宣言とコードは以下の通りです。
//获取所有参数的和 Php::Value mm_sum_all(Php::Parameters ¶ms) { int sum = 0; for (auto ¶m : params){ //字符串类型可以自动转换成整形 sum += param; } return sum; }
PHPテストコード
<?php $sum = mm_sum_all(1,2,'3','5'); //字符串类型可以自动转换成整形 echo 'sum (1,2,\'3\',\'5\') = ' . $sum . PHP_EOL; ?>
テスト出力結果:
sum (1,2,'3','5') = 11
関数関数:配列型パラメータを与えて、配列の全要素の合計を計算します
関数名: mm_sum_array
関数 mm_sum_array を登録します、登録方法は最初のセクションと同じです
関数の宣言とコードは次のとおりです。
//获取所有数组各元素的和 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テストコード
<?php $nums = array(1,3,5,7); $sum = mm_sum_array($nums); echo 'sum (array(1,3,5,7)) = ' . $sum . PHP_EOL; ?>
テスト出力結果:
sum (array(1,3,5,7)) = 16
上記関数の戻り値はスカラー型で、配列は特に一般的なものです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) }
C++ 素数決定と出力素数テーブル
PHP-CPP 関数開発ヘルプ
関連する推奨事項:
PHP 拡張機能の開発: 最初の拡張機能 hello world の作成
以上がPHP 拡張機能の開発: 独自の数学関数ライブラリの開発の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。