Eine kurze Diskussion des PHP-Quellcodes 29: Über die Vererbung von Schnittstellen

不言
Freigeben: 2023-04-02 06:30:02
Original
2172 Leute haben es durchsucht

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

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 &#39;ss&#39;;
}} class Foo extends Base implements FooInterface { } $foo = new Foo();$foo->method1();
Nach dem Login kopieren

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

A Kurze Diskussion des PHP-Quellcodes Siebenundzwanzig: PHPs Identifizierung von Konstruktionsmethoden

Eine kurze Diskussion des PHP-Quellcodes Sechsundzwanzig: Vereinfachung der PHP-Quick-Sort-Quellcode-Implementierung

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!

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