V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ANGI
V2EX  ›  PHP

PHP 继承问题

  •  
  •   ANGI · 2020-04-22 12:23:57 +08:00 · 2081 次点击
    这是一个创建于 1679 天前的主题,其中的信息可能已经有所发展或是发生改变。
    php 中的继承,子类是把父类的属性方法复制了一份放到自己内存中,还是只是继承了父类的权限,指向了父类中的属性方法? 如果只是指向,那子类中修改了属性,父类中的属性修改吗?(我自己验证并没有修改)~ 这个问题已经纠结了好几天了~ 请大神解惑! 还有 静态属性的继承和非静态的继承方式一样吗? 感觉不一样啊~
    dilu
        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 写时复制
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5973 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:43 · PVG 10:43 · LAX 18:43 · JFK 21:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.