浅谈PHP源码二十九:关于接口的继承

浅谈PHP源码二十九:关于接口的继承

内容导读

收集整理的这篇技术教程文章主要介绍了浅谈PHP源码二十九:关于接口的继承,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3473字,纯文字阅读大概需要5分钟

内容图文

这篇文章主要介绍了关于浅谈PHP源码二十九:关于接口的继承,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

浅谈PHP源码二十九:关于接口的继承

在之前有看过PHP源码中类的继承,今天我们看下PHP中的接口继承是如何实现的。
同样我们从CachingIterator类开始查找接口的继承实现。
CachingIterator extends IteratorIterator implements 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);}}

从zend_do_implement_interface函数的合并接口中的常量列表和方法列表操作,我们可以猜想这也许是接口中不能有变量可以有常量的原因之一吧
在接口继承的过程中有对当前类的接口中是否存在同样接口的判断操作,如果已经存在了同样的接口,则此接口将不会继承。
如下所示php代码:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

浅谈PHP源码二十八:关于类结构和继承

浅谈PHP源码二十七:PHP对构造方法的识别

浅谈PHP源码二十六:PHP快速排序源码实现的简化

以上就是浅谈PHP源码二十九:关于接口的继承的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的浅谈PHP源码二十九:关于接口的继承全部内容,希望文章能够帮你解决浅谈PHP源码二十九:关于接口的继承所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com