PHPモゞュヌルはただシンプルです。 パヌト2

nerezusが PHPの埋め蟌みに関する蚘事を曞いおいる間、拡匵機胜の蚘述に関する圌の話を続けようずしたす。 耇雑さは埐々に構築されるべきだず考えおいるため、すべおが語られるわけではありたせん。 この点に぀いおは、クラスの挔算子を眮き換える方法に぀いおはただ説明したせん。PHP拡匵機胜の開発に関する情報の䞻な著者であるSarah Golemonから、Operatorモゞュヌルの゜ヌスコヌドを読みたい人は誰でも。

私はLinuxのみで開発を行っおいるため、ペンを䜿甚しおVisual Studio甚のトリッキヌなアドオンを䜜成せずにれロから䜜成したす:)さお、すぐに理解しおから䜜業を簡玠化する方が良いでしょう。



たず、 config.m4ずMakefileの 2぀のファむルを䜜成する必芁がありたす。 最初の拡匵機胜は拡匵機胜を構築するために必芁であり、2番目の拡匵機胜は...このアセンブリがカタログを゜ヌスコヌドで損なわないようにするためです:)



1. config.m4



それでは始めたしょう。 アセンブリ甚のファむルを曞くこずはあたり面癜くないので、それらを枡しお䜕が䜕なのかを説明したす。 ここに蚭定の䞀般的なビュヌがありたす。

dnlで始たる行はコメントです。

最初の2行は--enable-mystringオプションを远加しおビルドしたす。 そのため、PHP゜ヌスの/ ext /フォルダヌにモゞュヌルを配眮し、PHPをビルドするかどうかを遞択できたす。

1-2行目をコメントアりトしお3-4行目をコメント解陀するず、オプションでパスを指定できる--with-mystringオプションが衚瀺されたす。 なんで ファむルに残っおいるすべおの行に぀いお:)特定のラむブラリこの䟋ではmylib1およびmylib2ラむブラリを指定を䜿甚する堎合、蚭定時にパスを枡すこずができたす。 実際、12〜29行目でこれらのラむブラリを芋぀けお接続しようずしおいたす。

次に、9行目に泚意しおください。これにより、構成甚の倉数<MODULE_NAME> _SHARED_LIBADDが远加され、リンク甚のラむブラリが远加されたす。 䞀般に、m4には任意の倉数名ではなく厳密な倉数名が必芁であるずいう事実に慣れおください。 これはスパルタです。

33〜35行目では、最も䞀般的なラむブラリをリンクに远加したす-それらを怜玢する必芁はありたせん。

36行目では、どのファむルから拡匵機胜を構築する必芁があるかを瀺しおいたす。

行32はさらに、モゞュヌルをCではなくC ++で䜜成しおいるこずを瀺しおいたすモゞュヌルを䜜成する堎合-違いはわずかですが、プラスラむブラリたたはプラスコヌドを接続する堎合は必芁になりたす。

今回は䜕も接続しないため 、蚭定を倧幅に短瞮したす。 たった10行-これ以䞊はありたせん。



2. Makefile



メむクファむルは、自尊心のあるプログラマヌが人生で少なくずも䞀床は曞いたこずがあるず思うので、説明は必芁ありたせん。 ですから、を䜿甚したす 。 `php-config --extension-dir`コマンドはPHP拡匵機胜が保存されおいるディレクトリを提䟛し、 __ buildディレクトリはすべおを収集するディレクトリであるこずに泚意しおください。



3. mystring.hファむルを䜜成したす



今䜕が必芁ですか たずもなC / C ++プログラムのように-ヘッダヌファむルずコヌドファむル。 ヘッダヌから始めたしょう。 ファむルも40行未満のシンプルなものになりたす。 それを芋おみたしょう。

行4〜5では、拡匵機胜の名前ずバヌゞョンを宣蚀したす。 これは、モゞュヌル情報の埌半でこの貎重な情報を衚瀺するためだけに必芁です。

行7は、クラスの名前を瀺しおいたす。 もちろん、「mystring」の蚘述はPHP_MYSTRING_CLASS_NAMEよりも短いですが、い぀でも1か所でクラス名を倉曎できたす。 たずえば、クラスの名前を「Mystring」に倉曎したす-倧文字を䜿甚し、適切な人々に適しおいたす。

9行目から11行目には、アセンブリプロセス䞭に生成されるconfig.hファむルが含たれおいたす-自分で䜜成するこずはありたせん。

次に、暙準ヘッダヌを含めお、関数を宣蚀したす。 ここで詳しく説明したす。 関数PHP_MINIT_FUNCTIONおよびPHP_MSHUTDOWN_FUNCTIONは、モゞュヌルのロヌドおよびアンロヌド時に実行される関数です。 それらに加えお、 * _GINIT_ *および* _GSHUTDOWN_ *-PHPをグロヌバルに起動/アンロヌドするための関数、および* _RINIT_ *および* _RSHUTDOWN_ * -モゞュヌルをアクティブ化/非アクティブ化するずきがありたす。 PHP_MINFO_FUNCTION関数は、 phpinfoが呌び出されたずきに実行される関数で、モゞュヌルに関する情報を生成したす。

次に、いく぀かのメ゜ッドを宣蚀したす-最初の郚分で、 PHP_FUNCTIONマクロを䜿甚しおそれらを宣蚀したしたが、それらはグロヌバルでしたか ここでは、基本的に同じこずを行っおいたす。マクロのみが、クラスずそのメ゜ッドの名前ずいう2぀のパラメヌタヌを取りたす。

さお、35行目の終わりに、モゞュヌルを宣蚀したす。

ヘッダヌファむルには他に䜕も必芁ありたせん。コヌドに進みたす。



4.モゞュヌルコヌドを蚘述したす-mystring.cc



ここでは、コヌドはより耇雑です。 残念ながら、それを蚘事に盎接入れるこずはできたせんでした-Habrは抗議したした-そこで私はすぐにすべおのコヌドをここに投皿したした 、ここではその内容のみを怜蚎したす。



1〜27行目


これたでのずころ、すべおが単玔です-将来のクラスを宣蚀し、モゞュヌルを宣蚀したす。 泚意しおください-名前、バヌゞョン、および関数MINIT 、 MSHUTDOWNおよびMINFOを指定したした 。 今回はグロヌバル関数を宣蚀せず、 RINITずRSHUTDOWNも必芁ありたせん。他のすべおはデフォルトず芋なすこずができたす。



29〜49行目


これで、モゞュヌルをPHPの䞀郚ずしおだけでなく、拡匵機胜ずしおコンパむルできるこずをPHPに䌝えるマクロを眮き換えたした。 その埌、クラス関数のセットを発衚したした。 各関数には、クラス名、関数の名前、 arg_info構造䜓ぞのポむンタヌ、およびアクセスパラメヌタヌの4぀のパラメヌタヌが瀺されたす。 arg_info構造の明確な説明に出䌚ったこずがないため、叀い方法でNULLを枡し、関数自䜓に既にあるパラメヌタヌを確認したす。

䞻なアクセスパラメヌタは、もちろんZEND_ACC_PUBLIC 、 ZEND_ACC_PROTECTEDおよびZEND_ACC_PRIVATEです。 それらに加えお、 ZEND_ACC_STATICたたはZEND_ACC_ALLOW_STATICを指定できたすこのメ゜ッドは静的および通垞の䞡方で䜿甚できたす。 コンストラクタ、デストラクタ、およびクロヌン挔算子PHPで__cloneの関数ずしお宣蚀されおいるの堎合、フラグZEND_ACC_CTOR 、 ZEND_ACC_DTOR 、およびZEND_ACC_CLONEをそれぞれ指定する必芁がありたす。

ただし、ヘッダヌファむルで完党なリストを確認できたす。私のマシンでは、これは/usr/include/php5/Zend/zend_compile.hファむルです。

PHP_ME を䜿甚しお説明した各メ゜ッドの埌に、カンマを入れる必芁がないこずに泚意しおください。 そしお最埌に、垞に3぀のNULLの配列があるはずです。

その間、先に進みたす。



51〜76行目


以前に発衚された3぀の方法ロヌド、アンロヌド、およびモゞュヌル情報が特定されたした。 3぀すべおのうち、1぀だけに興味がありたす。モゞュヌルのロヌドです。 たず、宣蚀したクラスを登録する必芁がありたす。

次に、登録されたクラスにプロパティを䜜成したす。登録されたクラスぞのポむンタ、プロパティの名前、この名前の長さこの行に぀いおは埌ほど、デフォルト倀を枡し、再びアクセスパラメヌタを枡したす。 最埌に、マゞックワヌドTSRMLS_CCを間違いなく蚘述する必芁がありたす。 この蚀葉は特に蚀及する必芁がありたす。 関数内でPHPの珟圚の状態を操䜜するには、珟圚の堎所を知り、クラスに関する情報を取埗する必芁がありたす。 など、この情報を送信する必芁がありたす。 これを行うには、関数を宣蚀するずきに、最埌にマクロTSRMLS_DCを蚘述し、 -TSRMLS_CCを呌び出す必芁がありたす。 どちらの堎合も、マクロの前にコンマを眮く必芁はありたせん 。

ここで、プロパティ名の長さに戻りたす。 さたざたな゜ヌスのプロパティの宣蚀に関する情報は非垞に少なく、矛盟しおいたす。 したがっお、同じSarah Golemonのマニュアルでは、プロパティがプラむベヌトずしお宣蚀されおいる堎合、「 \ 0 class_name \ 0 property_name」ずいう圢匏の名前を持っおいる必芁があるず蚘茉されおいたす。 実際には、 zend_mangle_property_nameを䜿甚するず、プロパティぞのアクセス時にPHPがダヌティを誓うこずがわかりたしたが、䞊蚘の呌び出しではすべおが玠晎らしいこずです。 トピックに関する文献を読む堎合は泚意しおください。



78〜106行目


それでは、暙準クラスのメ゜ッドを定矩したしょう。 ポむントに行きたしょう。

getThis関数は、メ゜ッドを呌び出したクラスのオブゞェクトぞのポむンタヌを返したす。 コンストラクタヌずデストラクタに぀いおは、このポむンタヌをチェックしたす。これらのメ゜ッドを静的に呌び出さないようにしたす。 次に、コンストラクタヌで、この関数を瀺すために、既に宣蚀されおいるプロパティ「str」を倉曎したす。 これを行うには、オブゞェクトクラスの型、オブゞェクト自䜓ぞのポむンタヌ、プロパティ名の名前ず長さ、および新しい倀を枡したす。 * _string関数ではなく* _stringlを䜿甚しおいるこずに泚意しおください-たた、新しい倀の長さを枡す必芁がありたす。 原則ずしお、文字列に文字「\ 0」が含たれる堎合、たたは逆に文字列の最初のN文字のみを曞き蟌みたい堎合に䜿甚されたすが、 * _stringオプションよりも少し速く動䜜するため、このような些现な状況で䜿甚したすが、远加のパラメヌタヌを蚭定しおもかたいたせん。

同様に、関数でRETURN_STRINGLマクロを䜿甚しお、クラスを文字列にキャストしたす。 最埌のパラメヌタ「1」に泚意しおください-これは、オブゞェクト自䜓ではなく、そのコピヌを転送するこずを意味したす。 あなたは圌らが埌で私たちのラむンで䜕をしたいのか決しおわかりたせん。



108行目から133行目


行を远加する方法を説明したしょう。

たず、文字列がパラメヌタヌずしお枡されたかどうかを確認したす-これに぀いおは、最初の郚分で既に説明したした。

次に、オブゞェクトに栌玍されおいる文字列をオブゞェクトから読み取りたす。 プロパティを文字列ずしお䜜成したしたが、ポむンタヌがzvalに戻ったこずに泚意しおください 。 事は、絶察にphpのすべおのデヌタ型がzval型で衚されるこずです 。 どのように機胜するかに興味がある堎合は、ファむル/usr/include/php5/Zend/zend.hでstruct _zval_structずunion _zvalue_valueの定矩を参照しおください。

最埌に、新しい行にメモリを割り圓お、元の行ず「アドむン」をそこにコピヌしたす。 次に、䜿い慣れたzend_update_property_stringlメ゜ッドを䜿甚しお、新しい倀を曞き蟌みたす。 PHPでは、 malloc 、 calloc、およびfreeの代わりに、 emalloc 、 ecalloc、およびefreeの送信類䌌物を䜿甚するのが習慣です 。

新しい倀は必芁な堎所にあり、 NULLを返すこずができたす 。 宿題オブゞェクト自䜓を返す方法を把握しお、 $ a-> append "a"-> append "b"ずいう圢匏のチェヌンを䜜成できるようにしたす...



135行目から148行目


最埌に、比范メ゜ッドを実装したす。 その䞭で、実際の比范を実装したせん悪魔はこのメ゜ッドを呌び出す理由を知っおいたすが、行を印刷したす-少なくずもどこかに衚瀺する必芁がありたす-そしお少し魔法を瀺したす。

たず、文字列strを読み取っお出力したす。 お気づきかもしれたせんが、 zend_printf関数の構文は、暙準のprintfずたったく同じです。 そしお...それは䜕ですか はい、私たちは簡単か぀制玄なくPHPコヌドを取埗しお実行したした。 パラメヌタヌずしお、コヌドの行、倉数ぞのポむンタヌ、実行結果を配眮する堎所、およびスクリプトの名前を枡したす。 䜕も発明しないように、myvardumpを䜜成したした。



たずめ



` make all install`ず入力したす 。 次のように入力したす。php -r '$ s = new mystring; echo $ s。 "\ n"; $ s-> append "Popyachso"; $ s-> compare; ' 、出力を芋おください

mystring

upchk !

object(mystring)#1 (1) {

["str:private"]=>

string(21) "upchk !"

}






最初の行は、クラスの行ぞのキャストを掚枬したこずです__toStringを参照。 2番目-すでに倉曎された文字列strを出力したす。 そしお残りの3行は、クラスのダンプであるzend_eval_stringの結果です。 䜜成された私有財産を芳察したす-すべおが公正です。



次は



たず、自己PRの䞀環ずしお、最近曞いた拡匵機胜のみをチェックアりトするこずをお勧めしたす。

svn checkout http://dingo-php.googlecode.com/svn/trunk/ dingo-php

ほずんどのナヌザヌにずっお、拡匵機胜自䜓は実際のアプリケヌションの芳点からはたったく面癜くないでしょうが、次のように芋るこずができたす。

-コンパむル䞭にオン/オフできる1぀の拡匵機胜で耇数のクラスを䜜成する方法

-サヌドパヌティのラむブラリをラップしお䜿甚する方法

-たあ、実際のコヌドのビット

さらに、サラゎレモンの本をお勧めしたす。

>> サラゎレモン「PHPの拡匵ず埋め蟌み」

ロシアでは、かなりの量のテンゲがかかりたすが、むンタヌネット䞊である皋床の努力をすれば、電子版を芋぀けるこずができたす。

この本は少し時代遅れですが、RINIT / RSHUTDOWNが必芁な理由、クラスに発生するむベントにハンドラヌを掛ける方法、ストリヌムを䜜成する方法、ini-configを操䜜する方法、およびオブゞェクトでさらに倚くのこずを行う方法を芋぀けるこずができたす。



Ps実隓のためにコピヌアンドペヌストするのが面倒な人のために、コンパむルの準備ができたモゞュヌルを含むアヌカむブを投皿したした narod.ru/disk/15177450000/mystring.tar.gz.html



All Articles