Dieser Artikel stellt hauptsächlich den PHP-Quellcode 29 vor: In Bezug auf die Vererbung von Schnittstellen hat er einen gewissen Referenzwert. Jetzt können Freunde in Not darauf verweisen.
Ein kurzer Vortrag über PHP-Quellcode neunundzwanzig: Über die Vererbung von Schnittstellen
Ich habe die Vererbung von Klassen im PHP-Quellcode schon einmal gesehen. Heute werfen wir einen Blick darauf, wie die Schnittstellenvererbung in PHP implementiert wird.
In ähnlicher Weise beginnen wir mit der CachingIterator-Klasse, um die geerbte Implementierung der Schnittstelle zu finden.
CachingIterator erweitert IteratorIterator implementiert OuterIterator, Traversable, Iterator, ArrayAccess, Countable
/* ArrayAccess接口的继承实现 */REGISTER_SPL_IMPLEMENTS(CachingIterator, ArrayAccess); // ext/spl/spl_functions.h 41行#define REGISTER_SPL_IMPLEMENTS(class_name, interface_name) \ zend_class_implements(spl_ce_ ## class_name TSRMLS_CC, 1, spl_ce_ ## interface_name); //zend/zend_API.c 2218行ZEND_API void zend_class_implements(zend_class_entry *class_entry TSRMLS_DC, int num_interfaces, ...) /* {{{ */{ zend_class_entry *interface_entry; va_list interface_list; va_start(interface_list, num_interfaces); while (num_interfaces--) { interface_entry = va_arg(interface_list, zend_class_entry *); zend_do_implement_interface(class_entry, interface_entry TSRMLS_CC); } va_end(interface_list);}/* }}} */ //zend/zend_complie.c 2887行ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC) /* {{{ */{ zend_uint i, ignore = 0; zend_uint current_iface_num = ce->num_interfaces; zend_uint parent_iface_num = ce->parent ? ce->parent->num_interfaces : 0; for (i = 0; i < ce->num_interfaces; i++) { if (ce->interfaces[i] == NULL) { memmove(ce->interfaces + i, ce->interfaces + i + 1, sizeof(zend_class_entry*) * (--ce->num_interfaces - i)); i--; } else if (ce->interfaces[i] == iface) {/* 已存在此接口 */ if (i < parent_iface_num) { ignore = 1; } else { zend_error(E_COMPILE_ERROR, "Class %s cannot implement previously implemented interface %s", ce->name, iface->name); } } } if (!ignore) { if (ce->num_interfaces >= current_iface_num) { if (ce->type == ZEND_INTERNAL_CLASS) { ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num)); } else { ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num)); } } ce->interfaces[ce->num_interfaces++] = iface;//接口数加1,将接口加入接口列表中 /* 合并接口中的常量列表和方法列表 */ zend_hash_merge_ex(&ce->constants_table, &iface->constants_table, (copy_ctor_func_t) zval_add_ref, sizeof(zval *), (merge_checker_func_t) do_inherit_constant_check, iface); zend_hash_merge_ex(&ce->function_table, &iface->function_table, (copy_ctor_func_t) do_inherit_method, sizeof(zend_function), (merge_checker_func_t) do_inherit_method_check, ce); do_implement_interface(ce, iface TSRMLS_CC); zend_do_inherit_interfaces(ce, iface TSRMLS_CC); }}
Anhand der konstanten Listen- und Methodenlistenoperationen in der zusammengeführten Schnittstelle der Funktion zend_do_implement_interface können wir vermuten, dass dies daran liegen kann, dass dies nicht möglich ist Einer der Gründe für Konstanten ist:
Im Prozess der Schnittstellenvererbung wird beurteilt, ob dieselbe Schnittstelle in der Schnittstelle der aktuellen Klasse vorhanden ist Schnittstelle wird nicht vererbt.
Der PHP-Code lautet wie folgt:
<?phpinterface FooInterface { public function method1();} class Base implements FooInterface { public function method1() { echo 'ss'; }} class Foo extends Base implements FooInterface { } $foo = new Foo();$foo->method1();
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website !
Verwandte Empfehlungen:
Eine kurze Diskussion des PHP-Quellcodes achtundzwanzig: Über Klassenstruktur und Vererbung
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion des PHP-Quellcodes 29: Über die Vererbung von Schnittstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!