Heim  >  Artikel  >  Backend-Entwicklung  >  Entwicklungshinweise zur PHP-Erweiterung (8) Schnittstellen erben und implementieren

Entwicklungshinweise zur PHP-Erweiterung (8) Schnittstellen erben und implementieren

WBOY
WBOYOriginal
2016-08-08 09:22:231091Durchsuche

Erben

Wir passen eine Ausnahmeklasse an, PHP-Code:

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

Code-Implementierung:

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

Die Hauptsache hier ist die Implementierung. Erstellen eine benutzerdefinierte Exception-Klasse ohne Methoden und erben Sie die Exception-Klasse. Das zend_register_internal_class_ex-Makro mit dem Suffix _ex wird verwendet. Der zweite Parameter zend_exception_get_default dieses Makros (beachten Sie die Header-Datei) gibt die übergeordnete Klasse auch über den Klassennamen an Die Definition von 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>
In dieser Methode muss

bei der Übergabe in Kleinbuchstaben vorliegen, andernfalls schlägt die Suche fehl und gibt NULL zurück, wenn nach dem Klassennamen (parent_name) gesucht wird, zum Beispiel: zend_hash_find

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

<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>
Das Obige stellt die Vererbungs- und Implementierungsschnittstelle der PHP-Erweiterung (8) vor, einschließlich des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn