问题说明
这里有一个 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 的析构函数何时会被执行?
4 回答
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
析构函数顺序与入栈顺序相反, "先进后出","后进先出" 后实例化,先从栈中弹出,执行析构函数
$a = new A;
$a->index();
与 B 类没啥关系吧?
这个问题与这个完全一致,可以参考这个答案PHP继承类时的执行顺序
炎炎设计
TA贡献1808条经验 获得超4个赞
子类B如果自己没有定义析构函数则会继承父类A的析构函数,析构函数会在当PHP决定你的脚本不再与对象相关时,PHP析构函数将被调用. 在一个函数的命名空间内,这会发生在函数return的时候. 对于全局变量,这发生于脚本结束的时候. 如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值. 通常将变量赋值为NULL或者调用unset,或者在使用exit的时候,都会执行A类的析构函数。
呼唤远方
TA贡献1856条经验 获得超11个赞
我觉得你可能没有理解继承这个概念。继承本质上还是新定义了一个类,只是拥有了父类非私有的方法和属性的定义。并不是说,一个类继承了另外一个类,它们就有先后顺序,这是不对的。在什么样的情况下会有父类和子类之分呢?就是在 static
和 self
的调用上会有区别。
你的这个例子,实际上是实例化了 B,实际上和 A 没有什么关系。你可以理解为 B 中拥有了 A 中定义的方法。如果子类中没有重新实现这个方法,那么子类就会认为父类中的析构方法是自己定义的。对于其它方法或者属性的继承,也是一样的。
- 4 回答
- 0 关注
- 493 浏览
添加回答
举报
0/150
提交
取消