Heim > Artikel > Backend-Entwicklung > Entwicklungshinweise zur PHP-Erweiterung (8) Schnittstellen erben und implementieren
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.