Maison  >  Article  >  développement back-end  >  Une brève discussion du code source PHP vingt-neuf : à propos de l'héritage des interfaces

Une brève discussion du code source PHP vingt-neuf : à propos de l'héritage des interfaces

不言
不言original
2018-06-29 09:35:252110parcourir

Cet article présente principalement le code source PHP vingt-neuf : concernant l'héritage des interfaces, il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Une brève discussion. à propos du code source PHP vingt-neuf : à propos de l'héritage des interfaces

J'ai déjà vu l'héritage des classes dans le code source PHP. Aujourd'hui, nous allons voir comment l'héritage des interfaces en PHP est implémenté.
De même, nous partons de la classe CachingIterator pour trouver l'implémentation héritée de l'interface.
CachingIterator extends IteratorIterator implémente 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);
}}

À partir des opérations de liste constante et de liste de méthodes dans l'interface fusionnée de la fonction zend_do_implement_interface, nous pouvons deviner que cela n'est peut-être pas le cas disponible dans l'interface Une des raisons pour lesquelles les variables peuvent avoir des constantes
Dans le processus d'héritage d'interface, il y a une opération de jugement pour savoir si la même interface existe dans l'interface de la classe actuelle. Si la même interface existe déjà, cela. l’interface ne sera pas héritée.
Le code PHP est le suivant :

<?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();

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au PHP. Site chinois !

Recommandations associées :

Une brève discussion du code source PHP vingt-huit : à propos de la structure et de l'héritage des classes

A brève discussion du code source PHP vingt-sept : identification des méthodes de construction par PHP

Une brève discussion du code source PHP vingt-six : simplification de l'implémentation du code source de tri rapide PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn