PHP 继承问题

2020-04-22 12:23:57 +08:00
 ANGI
php 中的继承,子类是把父类的属性方法复制了一份放到自己内存中,还是只是继承了父类的权限,指向了父类中的属性方法? 如果只是指向,那子类中修改了属性,父类中的属性修改吗?(我自己验证并没有修改)~ 这个问题已经纠结了好几天了~ 请大神解惑! 还有 静态属性的继承和非静态的继承方式一样吗? 感觉不一样啊~
2080 次点击
所在节点    PHP
1 条回复
dilu
2020-04-22 16:46:33 +08:00
为了你这个问题我特意去看了一下 PHP 的源码

大致实现是这样的

```c

void zend_compile_class_decl(zend_ast *ast) /* {{{ */
{
zend_ast_decl *decl = (zend_ast_decl *) ast;
zend_ast *extends_ast = decl->child[0];
zend_ast *implements_ast = decl->child[1];
zend_ast *stmt_ast = decl->child[2];
zend_string *name, *lcname;
zend_class_entry *ce = zend_arena_alloc(&CG(arena), sizeof(zend_class_entry));
zend_op *opline;
znode declare_node, extends_node;
# 省略
}
```

初步判断是:针对 extends 跟 implement 的类,都是指向父类

后面调用的地方太多抱歉没有精力看了

毛估是跟变量之类的一样,没有修改就指向父类,有修改就重新开辟内存。

百度关键词 COW 写时复制

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/664946

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX