0Pricing
PHP Academy · 课时

构造方法与析构方法

使用 __construct 初始化对象,并使用 __destruct 进行清理。

构造方法与析构方法 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。

简介:构造方法与析构方法

__construct() 方法会在创建新对象时自动运行。对象被垃圾回收时,__destruct() 方法会运行。PHP 8 引入了构造方法属性提升。

核心概念

构造方法与析构方法的核心概念:

  • __construct() 用于初始化对象
  • 构造方法属性提升可以缩短代码
  • __destruct() 用于清理资源(文件句柄、连接)
  • 使用 parent::__construct() 调用父类构造方法

基本构造方法

示例:

<?php
class User {
    public string $name;
    public string $email;

    public function __construct(string $name, string $email) {
        $this->name  = $name;
        $this->email = $email;
    }
}

$user = new User('Alice', 'alice@example.com');
echo $user->name; // Alice

构造方法属性提升(PHP 8)

继续:

<?php
class User {
    // Shorthand: declare and assign in one go
    public function __construct(
        public readonly string $name,
        public readonly string $email,
        private int $loginCount = 0,
    ) {}
}

$u = new User('Bob', 'bob@test.com');
echo $u->name;  // Bob

在构造方法中进行验证

练习:

<?php
class PositiveInt {
    public function __construct(private int $value) {
        if ($value <= 0) {
            throw new InvalidArgumentException(
                "Value must be positive, got $value"
            );
        }
    }
    public function get(): int { return $this->value; }
}

$n = new PositiveInt(5);  // OK
// new PositiveInt(-1);   // throws

析构方法

深入理解:

<?php
class FileLogger {
    private mixed $handle;

    public function __construct(string $path) {
        $this->handle = fopen($path, 'a');
    }

    public function log(string $msg): void {
        fwrite($this->handle, date('c') . ' ' . $msg . PHP_EOL);
    }

    public function __destruct() {
        if ($this->handle) fclose($this->handle);
        echo 'File handle released';
    }
}

命名构造方法模式

高级用法:

<?php
class Money {
    private function __construct(
        private float  $amount,
        private string $currency
    ) {}

    public static function usd(float $a): self { return new self($a, 'USD'); }
    public static function eur(float $a): self { return new self($a, 'EUR'); }

    public function format(): string {
        return number_format($this->amount, 2) . ' ' . $this->currency;
    }
}

echo Money::usd(9.99)->format(); // 9.99 USD

父类构造方法

实际应用模式:

<?php
class Animal {
    public function __construct(
        protected string $name,
        protected string $sound
    ) {}
}

class Dog extends Animal {
    public function __construct(string $name) {
        parent::__construct($name, 'Woof');
    }
    public function speak(): string {
        return "{$this->name} says {$this->sound}!";
    }
}

echo (new Dog('Rex'))->speak();  // Rex says Woof!

构造方法中的后期静态绑定

最佳实践:

<?php
class Base {
    public static function create(): static {
        return new static();  // 'static' resolves to calling class
    }
}

class Child extends Base {}

$base  = Base::create();   // Base object
$child = Child::create();  // Child object — static binding works

实用模式

通过一个实用模式,将构造方法与析构方法的知识融会贯通。

常见问题

请避免在使用构造方法与析构方法时犯以下常见错误:

  • 扩展类时始终调用 parent::__construct()
  • 在 PHP 8 及更高版本中使用构造方法属性提升,以减少样板代码
  • 析构方法不保证在特定时间运行
  • 优先使用命名构造方法,而不是多个 __construct() 重载

快速检查

PHP 8 中的构造方法属性提升是什么?

回顾:构造方法与析构方法

您已经学习了构造方法与析构方法。请记住以下要点:

  • 扩展类时始终调用 parent::__construct()
  • 在 PHP 8 及更高版本中使用构造方法属性提升,以减少样板代码
  • 析构方法不保证在特定时间运行
  • 优先使用命名构造方法,而不是多个 __construct() 重载

常见问题解答

「构造方法与析构方法」课时是免费的吗?

是的 — 「构造方法与析构方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。

「构造方法与析构方法」这节课中我会学到什么?

使用 __construct 初始化对象,并使用 __destruct 进行清理。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 PHP Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「构造方法与析构方法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 PHP Academy 课中编写并运行代码吗?

能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 类、属性与方法
  2. 构造方法与析构方法
  3. 静态属性与方法
  4. 魔术方法概览
← 返回 PHP Academy