


Une brève discussion du code source PHP vingt-neuf : à propos de l'héritage des interfaces
Jun 29, 2018 am 09:35 AMCet 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 'ss'; }} 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 :
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium)

Travailler avec les données de session Flash dans Laravel

Misque de réponse HTTP simplifié dans les tests Laravel

Construisez une application React avec un Laravel Back End: Partie 2, React

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST

12 meilleurs scripts de chat PHP sur Codecanyon
