构造方法与析构方法
使用 __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 反馈 — 无需本地设置。