15

個人的なプロジェクト用のPHP 拡張機能の作成に手を出しています。上記の記事にリンクされている内容を超えて、私は zend_engine についての知識がありません。私の C スキルは 10 年前のものであり、学問的な知識しかありませんでした。これらはすべて、「ばかげた質問をしているように見える場合は、おそらくそうです」と言うものです。

自分の拡張機能で他の PHP 拡張機能から関数を呼び出すことは可能ですか? それとも、各 PHP 拡張機能は島と見なされ、システムの他の部分への洞察はありませんか? これが可能である場合、それは一般的な慣行ですか、それとも悪い考えですか?

つまり、このような文字列を返すことができることを知っています。

PHP_FUNCTION(hello_world)
{
    char *str;
    str = estrdup("Hello World");
    RETURN_STRING(str, 0);
}

たとえば、SimpleXML 要素または DomDocument 要素を返すことができるようにしたいと考えています。拡張機能の開発に関する情報はそれほど多くなく、標準的な PHP の使用法に関する情報はたくさんあります。

4

3 に答える 3

4

はい、拡張機能は実際には他のものに依存する可能性があります。次のことができます。

  • クラス型や PHP 関数など、他の拡張機能がグローバルに登録するリソースを使用します (つまり、明らかにこれらのリソースを使用できるユーザーランド スクリプトよりアクセスが少なくないということです)。zend_call_functionおよびを参照してくださいzend_lookup_class_ex
  • ファイルで宣言されているエクスポートされたシンボルと構造を使用しますphp_extensionname.h(これらのヘッダーは、ネイティブ API を他の拡張機能にエクスポートすると見なされる唯一のものです)。ただし、一部の拡張機能では、実際にはそれらのヘッダー ファイルで宣言されている一部のシンボルがエクスポートされない場合がありますPHPAPI。一部の拡張機能は非アクティブ化できず、それらが存在することに依存できることに注意してください (たとえば、5.3/5.4 以降では、標準、SPL、リフレクション、日付、pcre、ereg)。
  • 拡張機能とターゲット拡張機能の両方が静的に構築されている場合は、もちろん、使用できるシンボルの自由度が高くなりますが、エクスポートされていないシンボルを使用することはお勧めできません。

たとえば、SimpleXML 要素または DomDocument 要素を返すことができるようにしたいと考えています。

SimpleXMLElementaまたは aを明示的にインスタンス化する必要がある場合はDOMDocument、 を使用して実行できますobject_init_ex。拡張機能は通常、zend_class_entry *そのマクロを渡す必要がある をエクスポートしますが、そうでない場合はいつでも を使用できますzend_lookup_class_ex。これはコンストラクターを呼び出さないため、必要に応じて手動で呼び出す必要があります。

一部の拡張機能は、オブジェクトをインスタンス化および初期化するためのネイティブ インターフェイスを提供する場合がありますが、一般に、拡張機能は、他の拡張機能にその型をインスタンス化させる準備ができていません。

もちろん、スクリプトのように、これらの型のいずれかを返す PHP 関数およびメソッドを呼び出すこともできます。zval *関数から返すことができる を取得します。

依存関係を宣言する方法については、拡張記述子にこのためのエントリがあります。これにより、依存していると宣言した拡張機能の後に拡張機能が確実に読み込まれます。コンパイル時の依存関係の宣言については、 を参照してくださいPHP_ADD_EXTENSION_DEP

于 2012-03-20T17:55:55.363 に答える
2

拡張機能を作成している場合、PHP の拡張と埋め込み(別名「サラの本」) は必読です。現在は少し古くなっていますが、オンラインまたはオフラインで入手できる最高のリソースです。

于 2012-03-19T20:28:27.670 に答える
1

PHP拡張機能の作成についてはあまり知りませんが、まだ読んでいない場合は、これを試すことができます http://devzone.zend.com/446/extension-writing-part-iii-resources/

これを使用すると、任意のタイプのリソースを php 拡張機能に渡すことができます

于 2012-03-19T19:38:32.613 に答える