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

发布于 2022-09-07 12:22:41 字数 472 浏览 27 评论 0

问题说明

这里有一个 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 的析构函数何时会被执行?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

·深蓝 2022-09-14 12:22:41

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

作死小能手 2022-09-14 12:22:41

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

$a = new A;

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

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

つ可否回来 2022-09-14 12:22:41

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

一影成城 2022-09-14 12:22:41

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文