【PHP】构造函数和析构函数

本文介绍了PHP编程中的构造函数和析构函数。构造函数在对象创建时自动调用,用于初始化对象;析构函数则在对象销毁时执行,讨论了如何触发对象销毁以及PHP的垃圾回收机制对析构函数的影响。

构造函数

当对象在创建的时候,将会自动调用构造方法__construct(), 在PHP中构造方法不可以进行重载

<?php

class Human {
    //属性是直接的量, 但是不可以是表达式的运算结果
    public $name = null;
    public $gender = null;
    //构造函数注意是两个下划线,在创建对象的时候就发挥作用
    public function __construct($name, $gender) {
        $this->name = $name;
        $this->gender = $gender;
    }
}


$a = new Human("李四", "女");
?>

new ClassName($args) ,将会把数据传送给构造方法, 然后构造方法用参数来影响对象, 然后返回给对象

析构函数

析构函数在对象销毁的时候执行,销毁对象对象的方式有这样几种,unset. null, false

//最终$d也被释放了
<?php
  
class Main {
  public function __construct() {
    echo "横空出世", "<br/>";
  }
  public function __destruct() {
    // TODO: Implement __destruct() method.
    echo "终究没能完成逆袭", '<br/>';
  }
  
}

$a = new Main();
$b = new Main();
$c = new Main();
$d = new Main();
unset($a);
$b = false;
$c = null;

?>

析构函数与垃圾回收机制

<?php
class Main {
  public function __construct() {
    echo "横空出世", "<br/>";
  }
  public function __destruct() {
    echo "终究没能完成逆袭", '<br/>';
  }
}

$a = new Main();

$b = $c = $d = $a;
unset($a);

echo "<hr/>";
?>

通过运行上面这个函数,当我么销毁掉$a的时候,对象并没有销毁,而是等到整个类运行完了之后,才销毁, 这是因为我们使用的unset销毁的只是指向对象的引用而已,除了指向对象的a之外还有b, c, d,当指向一个对象的引用全部被销毁之后,整个对象才会被完全销毁

### 构造函数析构函数的功能、操作与使用方法 构造函数析构函数是面向对象编程中类的重要组成部分,它们分别在对象创建销毁时自动调用,用于初始化清理资源。 #### 构造函数的功能与使用方法 构造函数用于初始化对象的状态,确保对象在被使用之前处于一个有效的状态。构造函数的特点如下: - **名称与类名相同** - **没有返回值类型** - **可以有参数,用于初始化成员变量** - **可以重载** 构造函数通常用于分配资源,例如动态内存分配、打开文件或建立网络连接等。 ##### 示例 ```cpp class SelliSt { public: // 构造函数初始化 SelliSt(int n = 4) { arr = (int*)malloc(sizeof(int) * n); size = 0; capacity = 0; } private: int* arr; int size; int capacity; }; ``` #### 析构函数的功能与使用方法 析构函数用于释放对象占用的资源,通常在对象生命周期结束时自动调用。析构函数的特点如下: - **名称是在类名前加上字符 `~`** - **没有参数** - **没有返回值** - **一个类只能有一个析构函数** 析构函数通常用于释放动态分配的内存、关闭文件句柄或断开网络连接等[^1]。 ##### 示例 ```cpp class SelliSt { public: // 析构函数完成资源的清理释放工作 ~SelliSt() { free(arr); size = 0; capacity = 0; } private: int* arr; int size; int capacity; }; ``` #### 构造函数析构函数的调用顺序 构造函数析构函数的调用顺序是相反的: - **造顺序**:按照成员变量在类中声明的顺序进行造。 - **顺序**:按照造的相反顺序进行[^4]。 #### 构造函数析构函数的实际应用 构造函数析构函数不仅用于初始化清理基本数据类型的成员变量,还可以用于管理复杂的数据结资源。 ##### 示例:管理动态内存 ```cpp class Test { public: // 构造函数 Test(int a, int b) { m_a = a; m_b = b; name = (char*)malloc(100); strcpy(name, "Zhang3"); } // 析构函数 ~Test() { if (name != NULL) { free(name); name = nullptr; std::cout << "释放了动态分配的内存" << std::endl; } } private: int m_a; int m_b; char* name; }; ``` #### 构造函数析构函数在不同语言中的实现 - **C++**:使用 `~ClassName()` 作为析构函数。 - **Python**:使用 `__init__()` 作为构造函数,`__del__()` 作为析构函数[^2]。 - **PHP**:使用 `__construct()` 作为构造函数,`__destruct()` 作为析构函数[^3]。 ##### Python 示例 ```python class MyClass: def __init__(self): print("Constructor called") def __del__(self): print("Destructor called") # 创建对象 obj = MyClass() # 删除对象 del obj ``` ##### PHP 示例 ```php class MyClass { public function __construct() { echo "Constructor called\n"; } public function __destruct() { echo "Destructor called\n"; } } // 创建对象 $obj = new MyClass(); // 对象在脚本结束时自动销毁 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值