ホームページ  >  記事  >  バックエンド開発  >  PHP拡張開発ノート(8) インターフェースの継承と実装

PHP拡張開発ノート(8) インターフェースの継承と実装

WBOY
WBOYオリジナル
2016-08-08 09:22:231088ブラウズ

継承

Exception クラスをカスタマイズします。PHP コード:

<code><span><span>class</span><span>TestException</span><span>extends</span><span>Exception</span> {</span>}</code>

コード実装:

<code><span>#include "Zend/zend_exceptions.h"</span>
zend_class_entry *test_exception_ce;
PHP_MINIT_FUNCTION(test)
{
    zend_class_entry tmp_ce;
    INIT_CLASS_ENTRY(tmp_ce, <span>"TestException"</span>, NULL);
    test_exception_ce = zend_register_internal_class_ex(&tmp_ce, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);

    <span>return</span> SUCCESS;
}</code>

ここで主なことは、メソッドなしでカスタム Exception クラスを実装し、Exception クラスを継承することです。 _ex サフィックスが付いた zend_register_internal_class_ex マクロが使用されます。このマクロの 2 番目のパラメーター zend_Exception_get_default (ヘッダー ファイルに注意してください) は、親クラスを指定することもできます。 name 親クラスを指定するには、zend_register_internal_class_ex の定義を確認できますzend_register_internal_class_ex 这个带有 _ex 后缀的宏,这个宏的第二个参数zend_exception_get_default(注意头文件)指定了父类,还可以通过类名的方式来指定父类,可以看zend_register_internal_class_ex 的定义

<code><span>/* If parent_ce is not NULL then it inherits from parent_ce
 * If parent_ce is NULL and parent_name isn't then it looks for the parent and inherits from it
 * If both parent_ce and parent_name are NULL it does a regular class registration
 * If parent_name is specified but not found NULL is returned
 */</span>
ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *class_entry, zend_class_entry *parent_ce, <span>char</span> *parent_name TSRMLS_DC) <span>/* {{{ */</span>
{
    zend_class_entry *register_class;

    <span>if</span> (!parent_ce && parent_name) {
        zend_class_entry **pce;
        <span>if</span> (zend_hash_find(CG(class_table), parent_name, <span>strlen</span>(parent_name)+<span>1</span>, (<span>void</span> **) &pce)==FAILURE) {
            <span>return</span> NULL;
        } <span>else</span> {
            parent_ce = *pce;
        }
    }

    register_class = zend_register_internal_class(class_entry TSRMLS_CC);

    <span>if</span> (parent_ce) {
        zend_do_inheritance(register_class, parent_ce TSRMLS_CC);
    }
    <span>return</span> register_class;
}
<span>/* }}} */</span></code>

这个方法里面parent_name 传进来的时候必须是小写的,否则在寻找类名(zend_hash_find

<code>test_exception_ce = zend_register_internal_class_ex(&tmp_ce, NULL, <span>"exception"</span> TSRMLS_CC); <span>//如果是Exception就会继承失败</span></code>
このメソッドでは、parent_name は渡されるときに小文字にする必要があります。それ以外の場合は、クラス名 ( > zend_hash_find) は失敗し、NULL を返します。例:

<code>zend_class_entry tmp_interface_ce;
INIT_CLASS_ENTRY(tmp_interface_ce, <span>"TestDataClass"</span>, test_data_interface_methodsd);
test_data_interface = zend_register_internal_class(&tmp_interface_ce TSRMLS_CC);

<span>/* TestDataClass implements Countable, ArrayAccess, IteratorAggregate */</span>
zend_class_implements(
    test_data_interface TSRMLS_CC, <span>3</span>, spl_ce_Countable, zend_ce_arrayaccess, zend_ce_aggregate
);

<span>return</span> SUCCESS;</code>

インターフェース定義rrreee

上記は、PHP 拡張機能の開発ノート (8) の継承と実装インターフェイスを内容も含めて紹介したもので、PHP チュートリアルに興味のある友人の参考になれば幸いです。

🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。