Z
ZHANK
面向对象

构造与析构

__construct、__destruct、构造函数参数提升(PHP8)、readonly

构造与析构

__construct 在对象创建时调用,__destruct 在对象销毁时调用。PHP 8 的构造函数属性提升让代码更简洁。

学完本章你将: 掌握 __construct/__destruct、属性提升、readonly。


构造与析构

php
<?php
class FileLogger {
    private $fp;

    public function __construct(string $path) {
        $this->fp = fopen($path, "a");
        echo "日志文件已打开\n";
    }

    public function log(string $msg): void {
        fwrite($this->fp, date("[Y-m-d H:i:s] ") . $msg . "\n");
    }

    public function __destruct() {
        if ($this->fp) {
            fclose($this->fp);
            echo "日志文件已关闭\n";
        }
    }
}

// 使用
$logger = new FileLogger("app.log");
$logger->log("用户登录");
// 脚本结束时自动调用 __destruct

构造函数属性提升(PHP 8)

php
<?php
// ❌ PHP 7 写法(啰嗦)
class User7 {
    private string $name;
    private int $age;
    public function __construct(string $name, int $age) {
        $this->name = $name;
        $this->age = $age;
    }
}

// ✅ PHP 8 写法(简洁)
class User8 {
    public function __construct(
        private string $name,
        private int $age,
    ) { }
}

readonly 属性(PHP 8.1+)

php
<?php
class DTO {
    public function __construct(
        public readonly string $id,
        public readonly DateTime $createdAt = new DateTime(),
    ) { }
}

$dto = new DTO("abc123");
// $dto->id = "new";  // ❌ 错误——readonly 不能改