PHP 中 B 子类继承 A 父类,A 父类何时会被销毁?

问题说明

这里有一个 A 父类

class A
{
    public function __construct()
    {
    }

    public function __destruct()
    {
        echo "Destroy";
    }
}

子类 B,并且让 B 继承 A


use A;
class B extend A
{
    public function __construct()
    {
    }

    public function index()
    {
        echo "Method: index";
    }
}

$a = new A;

$a->index();

能说一下PHP执行的流程吗,父类 A 的析构函数何时会被执行?

阅读 3.4k
4 个回答

由于A 是先被实例化的,所以 A 是最后被从栈内弹出,所有 A 的析构函数会最后执行

析构函数顺序与入栈顺序相反, "先进后出","后进先出" 后实例化,先从栈中弹出,执行析构函数

$a = new A;

$a->index();
与 B 类没啥关系吧?

这个问题与这个完全一致,可以参考这个答案PHP继承类时的执行顺序

子类B如果自己没有定义析构函数则会继承父类A的析构函数,析构函数会在当PHP决定你的脚本不再与对象相关时,PHP析构函数将被调用. 在一个函数的命名空间内,这会发生在函数return的时候. 对于全局变量,这发生于脚本结束的时候. 如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值. 通常将变量赋值为NULL或者调用unset,或者在使用exit的时候,都会执行A类的析构函数。

我觉得你可能没有理解继承这个概念。继承本质上还是新定义了一个类,只是拥有了父类非私有的方法和属性的定义。并不是说,一个类继承了另外一个类,它们就有先后顺序,这是不对的。在什么样的情况下会有父类和子类之分呢?就是在 staticself 的调用上会有区别。

你的这个例子,实际上是实例化了 B,实际上和 A 没有什么关系。你可以理解为 B 中拥有了 A 中定义的方法。如果子类中没有重新实现这个方法,那么子类就会认为父类中的析构方法是自己定义的。对于其它方法或者属性的继承,也是一样的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题