相关疑难解决方法(0)

在PHP中破坏对象的顺序是什么?

对象解构的确切顺序是什么?

从测试开始,我有一个想法:当前范围的FIFO.

class test1
{
    public function __destruct()
    {
        echo "test1\n";
    }
}

class test2
{
    public function __destruct()
    {
        echo "test2\n";
    }
}

$a = new test1();
$b = new test2();
Run Code Online (Sandbox Code Playgroud)

它会一次又一次地产生相同的结果:

test1
test2
Run Code Online (Sandbox Code Playgroud)

PHP手册是模糊的(重点煤矿突出不确定度):"为有特定对象的任何其它引用的析构函数方法将被立即调用,或者在关断期间,任何顺序 ".

解构的确切顺序是什么?任何人都可以详细描述PHP使用的销毁顺序的实现吗?而且,如果这个顺序在任何和所有PHP版本之间不一致,那么任何人都可以查明这个订单改变的PHP版本吗?

php php-internals

25
推荐指数
2
解决办法
3518
查看次数

PHP类构造函数中的范围展开

我正在学习PHP类和异常,并且,从C++背景来看,以下内容让我感到奇怪:

当派生类的构造函数抛出异常时,似乎基类的析构函数不会自动运行:

class Base
{
  public function __construct() { print("Base const.\n"); }
  public function __destruct()  { print("Base destr.\n"); }
}

class Der extends Base
{
  public function __construct()
  {
    parent::__construct();
    $this->foo = new Foo;
    print("Der const.\n");
    throw new Exception("foo"); // #1
  }
  public function __destruct()  { print("Der destr.\n"); parent::__destruct(); }
  public $foo;                  // #2
}

class Foo
{
  public function __construct() { print("Foo const.\n"); }
  public function __destruct()  { print("Foo destr.\n"); }
}


try {
  $x = new Der;
} …
Run Code Online (Sandbox Code Playgroud)

php exception stack-unwinding

10
推荐指数
1
解决办法
1177
查看次数

标签 统计

php ×2

exception ×1

php-internals ×1

stack-unwinding ×1