php擴充開發筆記(8)繼承和實現介面

來源:互聯網
上載者:User

繼承

我們自訂一個Exception類,php的代碼:

classTestExceptionextendsException {}

代碼實現:

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

這裡面主要就是實現了一個沒有方法的自訂Exception類,並且繼承了Exception這個類。採用了zend_register_internal_class_ex 這個帶有 _ex 尾碼的宏,這個宏的第二個參數zend_exception_get_default(注意標頭檔)指定了父類,還可以通過類名的方式來指定父類,可以看zend_register_internal_class_ex 的定義

/* 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 */ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *class_entry, zend_class_entry *parent_ce, char *parent_name TSRMLS_DC) /* {{{ */{    zend_class_entry *register_class;    if (!parent_ce && parent_name) {        zend_class_entry **pce;        if (zend_hash_find(CG(class_table), parent_name, strlen(parent_name)+1, (void **) &pce)==FAILURE) {            return NULL;        } else {            parent_ce = *pce;        }    }    register_class = zend_register_internal_class(class_entry TSRMLS_CC);    if (parent_ce) {        zend_do_inheritance(register_class, parent_ce TSRMLS_CC);    }    return register_class;}/* }}} */

這個方法裡面parent_name 傳進來的時候必須是小寫,否則在尋找類名(zend_hash_find)的時候就會失敗返回NULL,例如:

test_exception_ce = zend_register_internal_class_ex(&tmp_ce, NULL, "exception" TSRMLS_CC); //如果是Exception就會繼承失敗

介面定義

zend_class_entry tmp_interface_ce;INIT_CLASS_ENTRY(tmp_interface_ce, "TestDataClass", test_data_interface_methodsd);test_data_interface = zend_register_internal_class(&tmp_interface_ce TSRMLS_CC);/* TestDataClass implements Countable, ArrayAccess, IteratorAggregate */zend_class_implements(    test_data_interface TSRMLS_CC, 3, spl_ce_Countable, zend_ce_arrayaccess, zend_ce_aggregate);return SUCCESS;

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

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.