Home  >  Article  >  Backend Development  >  PHP extension development notes (8) Inheriting and implementing interfaces

PHP extension development notes (8) Inheriting and implementing interfaces

WBOY
WBOYOriginal
2016-08-08 09:22:231088browse

Inheritance

We customize an Exception class, PHP code:

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

Code implementation:

<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>

The main thing here is to implement a custom Exception class without methods, and inherit the Exception class. The zend_register_internal_class_ex macro with the _ex suffix is ​​used. The second parameter of this macro zend_exception_get_default (pay attention to the header file) specifies the parent class. You can also specify the parent class by the class name. You can see zend_register_internal_class_ex The definition of

<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>
In this method,

parent_name must be in lowercase when passed in, otherwise it will fail and return NULL when looking for the class name (zend_hash_find), for example:

<code>test_exception_ce = zend_register_internal_class_ex(&tmp_ce, NULL, <span>"exception"</span> TSRMLS_CC); <span>//如果是Exception就会继承失败</span></code>
Interface definition

<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>

The above introduces the PHP extension development notes (8) inheritance and implementation interface, including the content. I hope it will be helpful to friends who are interested in PHP tutorials.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn