php擴充開發筆記(8)繼承與實作介面

WBOY
發布: 2016-08-08 09:22:23
原創
1086 人瀏覽過

繼承

我們自訂一個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這個類別。採用了zend_register_internal_class_ex 這個帶有_ex 後綴的宏,這個巨集的第二個參數zend_exception_get_default(注意頭檔)指定了父類,也可以透過類名的方式來指定父類,可以看zend_exister_interzendregister_inter 的定義

<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)的時候就會失敗回傳NULL,例如:zend_hash_find

)的時候就會失敗回傳NULL,例如:

以上就介紹了php擴充開發筆記(8)繼承和實作接口,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板