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 的析构函数何时会被执行?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
由于A 是先被实例化的,所以 A 是最后被从栈内弹出,所有 A 的析构函数会最后执行
析构函数顺序与入栈顺序相反, "先进后出","后进先出" 后实例化,先从栈中弹出,执行析构函数
这个问题与这个完全一致,可以参考这个答案PHP继承类时的执行顺序
子类B如果自己没有定义析构函数则会继承父类A的析构函数,析构函数会在当PHP决定你的脚本不再与对象相关时,PHP析构函数将被调用. 在一个函数的命名空间内,这会发生在函数return的时候. 对于全局变量,这发生于脚本结束的时候. 如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值. 通常将变量赋值为NULL或者调用unset,或者在使用exit的时候,都会执行A类的析构函数。
我觉得你可能没有理解继承这个概念。继承本质上还是新定义了一个类,只是拥有了父类非私有的方法和属性的定义。并不是说,一个类继承了另外一个类,它们就有先后顺序,这是不对的。在什么样的情况下会有父类和子类之分呢?就是在
static
和self
的调用上会有区别。你的这个例子,实际上是实例化了 B,实际上和 A 没有什么关系。你可以理解为 B 中拥有了 A 中定义的方法。如果子类中没有重新实现这个方法,那么子类就会认为父类中的析构方法是自己定义的。对于其它方法或者属性的继承,也是一样的。