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

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

WBOY
Freigeben: 2016-08-08 09:22:23
Original
1105 Leute haben es durchsucht

Erben

Wir passen eine Ausnahmeklasse an, PHP-Code:

<code><span><span>class</span><span>TestException</span><span>extends</span><span>Exception</span> {</span>}</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
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>
Nach dem Login kopieren
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>
Nach dem Login kopieren
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.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage