ホームページ > バックエンド開発 > PHPチュートリアル > CおよびPHP-CPPを使用したPHP拡張機能の開発:Advanced

CおよびPHP-CPPを使用したPHP拡張機能の開発:Advanced

Joseph Gordon-Levitt
リリース: 2025-02-18 12:30:12
オリジナル
715 人が閲覧しました

CおよびPHP-CPPを使用してPHP拡張機能を開発:高度なトピックとベストプラクティス

キーポイント

    CおよびPHP-CPPを使用したPHP拡張の開発には、「この」ポインターの返却、複雑なオブジェクトポインターの返却、魔法のメソッドの公開、メンバー関数呼び出しのリンク、PHPでの例外スローと処理などの高度なトピックが含まれます。
  • __toStringPHP-CPPライブラリは、将来の非PHPプロジェクトにソフトウェア、データ構造、またはアルゴリズムを必要とするプロジェクト、またはPHP拡張としてまだ提供されていないツールまたはライブラリを使用する必要があるプロジェクトに最適です。また、理解とメンテナンスを容易にするために、構造化されたオブジェクト指向のコードを維持しながら、C/Cコードのパフォーマンスの利点を提供します。
  • PHP-CPPライブラリは、個人および商業プロジェクトに使用できます。ただし、ライブラリ自体は無料ですが、効果的に使用する方法を学び、PHP拡張機能を維持するには時間とリソースがかかる場合があります。
  • Cを使用したPHP拡張開発の一般的な課題には、メモリの正しい管理、エラーと例外の取り扱い、およびPHPとCの間のインターフェイスが含まれます。これらの課題は、PHPとCへの洞察を得て、優れたプログラミングプラクティスを使用し、PHP-CPPが提供する機能とツールを活用することで克服できます。
  • 以前の投稿では、C(最初と2番目の投稿)を使用してPHP拡張機能を作成するPHP-CPPライブラリを紹介しました。後者の投稿では、複数の操作に複雑なクラスを使用してPHP拡張機能を作成するオブジェクト指向の側面を示します。

この紹介は完全ではありません。なぜなら、記事の主な焦点は、オブジェクト指向の実装の詳細よりもPHP-CPPのオブジェクト指向の機能を実証することであるからです。 Developing PHP Extensions with C   and PHP-CPP: Advanced この記事では、複雑なライブラリの開発にさらに飛び込み、メンバー関数を追加し、PHP-CPPを使用してオブジェクト指向のPHP拡張機能を書く際にいくつかの高度なトピックに対処します。

このポインターを返します

複雑なオブジェクトポインター、つまり複合体 *

open

Magic Method;
    チェーンメンバー関数呼び出し
  • 例外の上に、php
  • で処理します
  • 完全な複雑なライブラリソースコードとテストPHPスクリプトは、このgithubリポジトリにあります。
  • __toString始めましょう。
  • 準備
環境を準備するプロセス全体を最初の記事で説明します。

このポインターをc メンバー関数を使用して、複雑な数値でさまざまな数学操作を実行します。このデモンストレーションでは、そのような機能を4つ実装します:add、sub、mul、およびdiv。最初の3つについて説明します。 DIV関数には例外処理が含まれ、後で説明します。

MUL関数を見てみましょう(乗算用)。追加およびサブ機能はほぼ同じです。

注:この記事では、MakeFileおよびINIファイルの変更、メンバーの機能、クラス、名前空間などの登録など、以前に説明したいくつかの基本的なトピックを紹介しません。これらの内容については、前のセクションを参照してください。

このポインターをCからPHPに戻すのは簡単です。このC関数内では、このポインター(複雑な*タイプとして)をPHP :: valueタイプとしてPHPに返すことができます。変換はオブジェクト情報を失うことはありません。また、明示的なタイプ変換は必要ありません。

複雑なオブジェクトポインターを返します

これを返すことは、通常、オブジェクト自体が変更されたことを意味します。ただし、場合によっては、新しいオブジェクトを返して、「現在」オブジェクト(コールオブジェクト)を変更しておきたいと思う場合があります。

複雑なクラスでは、特定の複雑な数のコンジュゲート数を返す関数(biはA-Biになります)があります。

Php::Value add(Php::Parameters &params) {
    Php::Value t = params[0];
    Complex *a = (Complex *) t.implementation();

    r += (double) a->getReal();
    i += (double) a->getImage();

    return this;
}
ログイン後にコピー
ログイン後にコピー
ここでの重要なポイントは、PHP ::オブジェクトを使用して複雑な*オブジェクトをPHP ::オブジェクトに明示的に変換する必要があることです。そのアクセシビリティ。

この関数の最初のパラメーターは、クラスタイプ、この場合はtrcomplexです。このクラス(「複雑な」)を別の名前空間( "TR")に巻き付けたので、私はこの名前を使用しています。

2番目のパラメーターは、渡されるオブジェクトです。

新しいクラスインスタンスを返すことは、このポインターを返すよりも少し難しいですが、ドキュメントを読んで正しい部分を見つけている限り、管理しやすいです。その他の使用例については、公式のPHP-CPPドキュメントでこのセクションをお読みください。

オープン__toString Magic Method

私たちのクラスでは、複数の数字をより読みやすい方法で印刷する関数、たとえば1 2iがあります。私の以前の投稿では、この関数は公開されていません(またはPHP-CPP用語で「登録」されていませんが、内部PHPから呼び出すことができます。ただし、数学的操作を適用した後に複雑なオブジェクトにこの関数を呼び出すために(例:「echo $ a-> add($ b) - > sub($ c)」)、コンパイルする必要があります拡張機能に明示的に登録されています:

__toStringPHP-CPPリポジトリの問題#150で提出した問題では、なぜこれを行わなければならないのかを詳細に説明しています。

Php::Value conjugate() {
    Complex *t = new Complex();

    t->r = r;
    t->i = -i;

    return Php::Object("tr\Complex", t);
}
ログイン後にコピー
ログイン後にコピー

チェーンメンバー関数呼び出し

このクラスで実装する必要があることの1つは、メンバー関数をリンクできるようにすることです。これにより、次の計算を行うことができます。結果は、メンバー関数を呼び出すことができるはずです。 これは上記の方法、つまりこのポインターをPHPに返すことによって行われます。ただし、古いPHP-CPPライブラリには、オブジェクトを参照した場合、リンクメソッドが呼び出された場合、「セグメント障害」が作成されます。

問題が提出され(#151)、PHP-CPPソースコードパッチを含むコミットが送信されました。 PHP-CPPライブラリの古いバージョンを使用してPHP-CPPライブラリと独自のライブラリをコンパイルしている場合は、PHPソースコードを更新し、PHP-CPPライブラリとライブラリを再コンパイルして再インストールしてください。

提出概要で説明されているように、

私自身のプロジェクトの仕事が、私が使用する図書館がより良くなるのを助けることができてうれしいです。

complex.method("__toString", &Complex::__toString);
ログイン後にコピー
ログイン後にコピー
php

のスローと処理の例外

複雑なクラスでさらに2つの関数が、処理のために例外をPHPに戻すことができます:DivとPhi。前者は分割操作を実行しますが、後者はその代替表現である極座標表現(r、θ)に示されているように、複雑な数の角度を返します。

複数の数値をパラメーター(または発信者)として渡すが、パーツと想像上の部分が実際に0の場合、両方の操作が失敗する可能性があります。これら2つの操作については、例外処理を実行する必要があります。 Cコードに例外を投げかけていることを忘れないでください。PHPスクリプトは例外をキャッチし、必要な処理を行います。

Php::Value add(Php::Parameters &params) {
    Php::Value t = params[0];
    Complex *a = (Complex *) t.implementation();

    r += (double) a->getReal();
    i += (double) a->getImage();

    return this;
}
ログイン後にコピー
ログイン後にコピー
PHPスクリプトでは、この例外をキャッチします。

上記のコードスニペットには、次のテキスト行が表示されます。
Php::Value conjugate() {
    Complex *t = new Complex();

    t->r = r;
    t->i = -i;

    return Php::Object("tr\Complex", t);
}
ログイン後にコピー
ログイン後にコピー

とても簡単ですよね?拡張機能で構築されたC例外はPHPに渡され、正しくキャッチされます。さらに、他のPHPコードでスローされたネイティブPHP例外を処理するなど、例外を操作できます!

complex.method("__toString", &Complex::__toString);
ログイン後にコピー
ログイン後にコピー

すべての関数をテスト

最後に、complex.soの拡張機能をコンパイルしてインストールできます。すべてがうまくいけば、端末に次のコマンドを発行することにより、拡張機能のインストールを確認できます。

端子には、「/etc/php5/cli/conf.d/complex.ini」というラインを表示する必要があります。拡張機能がインストールされ、PHPスクリプトで呼び出される準備ができていることを確認できます。

make && sudo make install注:この拡張機能のMakeFileを確認すると、このPHP拡張機能をCLI環境にインストールしていることがわかります。 Apacheがロードできるようにこの拡張機能をインストールする場合は、次の行を変更します。

この拡張機能のテストPHPスクリプトは次のとおりで、いくつかのメモがあります。
<code>修复问题#151,链式方法调用无法正常工作……
……因为每个对象的引用计数未正确更新,这导致即使对象已分配给不同的变量,该对象也会被销毁。</code>
ログイン後にコピー

すべてのテストスクリプトは正しく実行され、例外が正しくキャッチされます。

結論
Php::Value div(Php::Parameters &params) {
    Php::Value t = params[0];
    Complex *b = (Complex*) t.implementation();

    double t1 = b->mod() * b->mod();

    if (t1 == 0)
        throw Php::Exception("Division by zero");

    double tr = r * (double) (b->getReal()) + i * (double) (b->getImage());
    double ti = i * (double) (b->getReal()) - r * (double) (b->getImage());

    r = tr / t1;
    i = ti / t1;

    return this;
}
ログイン後にコピー

これは、この強力なライブラリの構築に関する3つの記事シリーズをまとめたものです。オブジェクト指向プログラミングの基本、オブジェクト指向の側面、およびいくつかの高度なトピックについて説明します。また、PHP-CPPの改善を支援しました。
$a=new tr\Complex(1,2);
$c=new tr\Complex(); //$c实际上是0+0i

try
{
    $res=$a->div($c);
}
catch(Exception $e)
{
    echo "Caught exception: ".$e->getMessage()."\n";
}
}
ログイン後にコピー

php-cppで他に何ができますか? Emiel Bruijntjes(PHP-CPPの共著者)から受け取った電子メール通信の数行を引用してください:

プロジェクトに取り組んでいて、次の要件の1つ以上がある場合、PHP-CPPライブラリは理想的です。 - ソフトウェア/データ構造/アルゴリズムに取り組んでおり、将来的にはソフトウェアも非PHPプロジェクトでも使用できることを確認する必要があります。 - PHP拡張機能としてまだ利用できないツールまたはライブラリを使用する必要があります。 - C/Cコード(PHPと比較)のパフォーマンスが向上しますが、他の開発者/同僚による理解とメンテナンスのために、構造化されたオブジェクト指向のコードも構築する必要があります。

可能性は非常に大きい:フレームワーク(ファルコンなど)、テンプレート言語(SmartyやTwigなど)など。

コメントや意見を残して、このライブラリで何をしたか教えてください!

c

を使用したPHP拡張の開発に関するFAQ

Cを使用してPHP拡張機能を開発することの利点は何ですか?

Cを使用してPHP拡張機能を開発することには多くの利点がありますまず、PHPアプリケーションでのCのパワーと柔軟性を活用できます。これにより、特に計算集約型のタスクでのパフォーマンスが向上します。第二に、PHP環境で既存のCコードを再利用する方法を提供します。これにより、多くの開発時間と労力を節約できます。最後に、PHPの機能を拡張し、標準のPHPライブラリでは利用できない機能を提供するカスタムPHP拡張機能を作成できます。

PHP拡張開発のためにCの使用を開始する方法は?

PHP拡張開発にCの使用を開始するには、PHPおよびCプログラミング言語を基本的に理解する必要があります。また、PHP開発環境とCコンパイラをインストールする必要があります。これらの前提条件をインストールした後、CでPHP拡張機能の書き込みを開始できます。このプロセスをガイドするためのチュートリアルやサンプルコードなど、オンラインで利用可能な多くのリソースがあります。

PHP-CPPとは何ですか?PHP拡張の開発にどのように役立ちますか?

PHP-CPPは、Cを使用してPHP拡張機能を開発するためのライブラリです。 Cクラスとメソッドのセットを提供し、PHP拡張機能を作成するプロセスを簡素化します。 PHP-CPPを使用すると、Cのおなじみの構文と概念を使用して、より自然で直感的な方法でPHP拡張機能を記述できます。これにより、開発プロセスがより効率的になり、エラーを減らすことができます。

商用プロジェクトにPHP-CPPを使用できますか?

はい、PHP-CPPは、個人および商業プロジェクトで使用できるオープンソースソフトウェアです。ただし、ライブラリ自体が無料である間、効果的に使用する方法を学び、PHP拡張機能を維持するために時間とリソースを投資する必要がある場合があることを理解することが重要です。

Cを使用したPHP拡張開発の一般的な課題は何ですか?また、それらを克服するにはどうすればよいですか?

Cを使用したPHP拡張開発のいくつかの一般的な課題には、メモリの正しい管理、エラーと例外の取り扱い、およびPHPとCの間のインターフェイスが含まれます。これらの課題は、PHPとCへの洞察を得て、優れたプログラミングプラクティスを使用し、PHP-CPPが提供する機能とツールを活用することで克服できます。

cで記述されたPHP拡張機能をデバッグする方法は?

Cで記述されたPHP拡張機能は、標準のCデバッグツールを使用してデバッグできます。さらに、PHP-CPPは、例外処理やエラーレポートなど、デバッグを支援できるいくつかの機能を提供します。

他のCライブラリでPHP-CPPを使用できますか?

はい、PHP-CPPは他のCライブラリで使用できます。これにより、PHP拡張機能のさまざまなC機能を活用できます。

Cで記述されたPHP拡張機能のパフォーマンスを改善する方法は?

効率的なアルゴリズムとデータ構造を使用し、メモリ使用量を最小限に抑え、Cコードを最適化することにより、PHP拡張機能のパフォーマンスを改善できます。さらに、PHP-CPPは、PHP変数や関数への直接アクセスなど、パフォーマンスを改善するのに役立ついくつかの機能を提供します。

PHP-CPPプロジェクトにコードを提供できますか?

はい、PHP-CPPプロジェクトはオープンソースであり、コミュニティの貢献は歓迎されます。バグを報告したり、新機能を提案したり、パッチを送信したりすることで、コードを貢献できます。

PHP拡張開発にCを使用することに関するリソースをどこで見つけることができますか?

PHP拡張開発にCを使用することを学習するためにオンラインで利用できる多くのリソースがあります。これらのリソースには、チュートリアル、サンプルコード、ドキュメント、フォーラムが含まれます。さらに、PHP-CPP Webサイトは、ライブラリの使用に関する大量の情報とリソースを提供しています。

以上がCおよびPHP-CPPを使用したPHP拡張機能の開発:Advancedの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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