- ベストアンサー
Z_OBJCE_P()について
いつもお世話になっています。 PHPの勉強を始めた初心者です。 Z_OBJCE_P() の使い方がよく分りません。 お教えいただければ幸いです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
PHP というより C++ のような気が。。。 #いや PHP には違いないのですが。。。 Zend/zend_API.h , Zend/zend_operators.h を参照されては? PHP extension を作成するときなどでオブジェクトにアクセスするときに使っているようです。 初心者ということで、勘違いされているような気がしますが、あなたは PHP そのものを開発 or 拡張したいのですか? であれば、なにか extension (オブジェクトをサポートしているものが良いです)のソースを pecl などから手に入れて読んでみるといいと思います。
お礼
is_callable()の第二引数の使い方がよく分らなかったので、質問をさせて頂いたところ、「zend_API.c に実際の処理内容が記述されています」とのアドバイスを他の方から頂きました。 それで、zend_API.c を見てみたところ、 ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, char **callable_name TSRMLS_DC) /* {{{ */ { return zend_is_callable_ex(callable, NULL, check_flags, callable_name, NULL, NULL, NULL TSRMLS_CC); } とありましたので、 ZEND_API zend_bool zend_is_callable_ex(zval *callable, zval *object_ptr, uint check_flags, char **callable_name, int *callable_name_len, zend_fcall_info_cache *fcc, char **error TSRMLS_DC) /* {{{ */ の中を見たところ、 if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) { fcc->called_scope = fcc->calling_scope; return 1; } を見つけました。それで、 fcc->calling_scope とは何かを探したところ、 switch (Z_TYPE_P(callable)) { case IS_STRING: if (object_ptr) { fcc->object_ptr = object_ptr; fcc->calling_scope = Z_OBJCE_P(object_ptr); となっていました。それで、 Z_OBJCE_P() を探したのですが、見つけることができなかったので、質問をさせていただきました。 ところが本日ご紹介いただいた zend_operators.h を見てみたら、そこに Z_OBJCE_P() の定義が記述されていました。 #define Z_OBJCE_P(zval_p) Z_OBJCE(*zval_p) #define Z_OBJCE(zval) zend_get_class_entry(&(zval) TSRMLS_CC) zend_get_class_entry(&(zval) TSRMLS_CC) は、 zend_API.c に定義が記述されており、クラスの型チェックを行うものであることが分りました。 結局、当初の疑問を解消してくれる記述はソースコード内に見当たりませんでしたが、少しスッキリしました。 どうも、ありがとうございました。m(_ _)m