ホームページ  >  記事  >  バックエンド開発  >  PHP ソース コード 29 についての簡単な説明: インターフェイスの継承について

PHP ソース コード 29 についての簡単な説明: インターフェイスの継承について

不言
不言オリジナル
2018-06-29 09:35:252112ブラウズ

この記事では主に PHP のソース コードについて 29 を紹介します。インターフェースの継承に関しては、ある参考値があるので、必要な方は参考にしてください。

#PHP ソース コードについての簡単な話 29: インターフェイスの継承について

PHP ソース コードでのクラスの継承については以前に見てきましたが、今日は PHP でのインターフェイスの継承がどのように実装されるかを見ていきます。

同様に、CachingIterator クラスから開始して、インターフェイスの継承された実装を見つけます。
CachingIterator は IteratorIterator を拡張し、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 関数のマージされたインターフェイスの定数リストとメソッド リストの操作から、これはおそらく、定数の理由の 1 つは、インターフェイスの継承のプロセスで、同じインターフェイスが現在のクラスのインターフェイスに存在するかどうかの判定操作です。同じインターフェイスが既に存在する場合、このインターフェイスは使用されません。継承されません。

php コードは次のとおりです:

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

以上がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトを参照してください。 !

関連する推奨事項:

PHP ソース コードに関する簡単な説明 28: クラス構造と継承について


A PHP ソース コードについての簡単な説明 27: PHP の構築方法の特定


## PHP ソース コードについての簡単な説明 26: PHP クイック ソート ソース コードの実装の簡略化

以上がPHP ソース コード 29 についての簡単な説明: インターフェイスの継承についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。