php析构函数疑惑

<?php
class Test {
    public $start;
    public $end;
    
    public function __construct() {
        echo "__construct<br />";
        $this->start = microtime(true);
    }
    
    public function test() {
        echo "in test()<br />";
        throw new Exception("error", 500); // 抛出异常 
    }
    
    public function __destruct() {
        echo "__destruct<br />";
    }
}

$test = new Test();
$test->test();

方法里抛出异常后,不会调用析构函数:

try异常后能调用析构函数:

<?php
class Test {
    public $start;
    public $end;
    
    public function __construct() {
        echo "__construct<br />";
        $this->start = microtime(true);
    }
    
    public function test() {
        echo "in test()<br />";
        try { // try 异常
            throw new Exception("error", 500); // 抛出异常 
        } catch(Exception $e) {
        }
    }
    
    public function __destruct() {
        echo "__destruct<br />";
    }
}

$test = new Test();
$test->test();

时间: 2024-08-06 20:02:31

php析构函数疑惑的相关文章

构造函数和析构函数的作用[转]

千万不要把构造函数和析构函数同普通的函数等同起来看待. 给你一段介绍,这个是一位真正的高手的回答,看了你就会明白的.第9章         类的构造函数.析构函数与赋值函数构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险.         每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四

!析构函数的调用

if (...) { class a; } 在if语句结束后,class a的析构函数被调用. 很简单但是经常会疑惑或者犯错误,不知道析构函数什么时候调用. 而且如果class a中含有指针,然后给class b赋值后,经常会犯一个知名的错误. class a{ int i; int * pointer; ... } class b{ int i; int * pointer; } if (...) { class a = new a(); b = a; } 到这一步,b.i是有值的,而b.po

C++ 类的析构函数 (~)

在上一章中, 我们已详细地讲解了类的构造函数, 如果对类还不熟悉的话看这里 如果发现本章内容不适合你, 可以看这里 在本章中, 类的初步基础已有一些了, 继续深入 在类中, 有了构造函数, 不知有没有想过, 与构造函数相反的功能? 构造函数开辟空间, 赋值变量, 有没有释放空间, 还原变量的呢?----当然有 重点介绍析构函数 (与构造函数相反), 构造函数在变量一创建就调用, 而析构函数在变量被摧毁时调用 什么叫摧毁? 即为变量的作用域已超出, 程序终止时该变量就被摧毁 好了, 那么析构函数如

SQL Server中的索引结构与疑惑

说实话我从没有在实际项目中使用过索引,仅知道索引是一个相当重要的技术点,因此我也看了不少文章知道了索引的区别.分类.优缺点以及如何使用索引.但关于索引它最本质的是什么笔者一直没明白,本文是笔者带着这些问题研究msdn的一点小结以及一大堆疑惑. 1.表结构 当开发者在数据库中创建一个表时,此时默认为这个表创建了一个分区,注意是一个分区.分区是一种数据组织单元,在这个分区中可存在2种结构,分别是堆结构或B树结构(索引结构),也就是说一个分区里要么是堆结构要么是B树结构.为了在某些方面提高性能以及便于

C++基础3 类:构造 拷贝 析构函数,

为什么会出现构造函数 与 析构函数 [email protected]:~/c++$ cat main.cpp  #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; class Test { public: void init() { a = 1; b = 2; } private: int a; int b; }; int main() { Test arr[

C++ 构造函数和析构函数

构造函数: 作用: 1)分配空间:分配非静态数据成员的存储空间 2)初始化成员:初始化非静态数据成员 分配空间: 1)含有指针变量,需要程序员显式申请空间(使用new申请) 2)非指针变量:由系统自动分配空间 初始化成员: 1)使用赋值语句初始化:一般的变量 2)使用表达式表初始化:一般的变量 +  Const成员,引用成员,对象成员 调用时机:在定义对象的时候,系统自动调用构造函数 1)对象被创建时,自动调用构造函数 Coord p1(1); Coord p2=1;  //此时也会调用构造函数

构造函数和析构函数是否可以被重载

构造函数可以被重载,因为构造函数可以有多个且可以带参数. 析构函数不可以被重载,因为析构函数只能有一个,且不能带参数.

C++:析构函数

一.什么是析构函数 析构函数是类中一种特殊的成员函数,但其功能和构造函数是相反的,当对象结束其生命周期时,系统会自动调用该对象的析构函数进行清理工作(如释放内存中分配给该对象的空间,关闭打开的文件等).另外析构函数没有返回值,不需要参数,也不能被重载且一个类中有且只能有一个析构函数.但和构造函数相似,析构函数的函数名和类名相同,只不过需要在函数名向加上一个~. 语法:~ 类名(){/*...析构函数体...*/} 特别注意: ? 如果用户没有显式地在类中定义析构函数,编译器会在类中生成一个默认的

关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法

类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{    public $name;//成员变量    //成员属性(存在于强类型语言中)    protected $blood;    private $attack;    //成员方法    function skill(){        echo "$this->name<br>control";            }} $s = new Hero();//造