PHP new 关键字
最后修改于 2025 年 4 月 16 日
PHP 的 new
关键字是面向对象编程的基础。它创建一个类的实例,为对象分配内存。new 操作符调用类的构造函数来初始化对象。理解 new 对于在 PHP 中使用对象至关重要。
基本定义
new
关键字实例化一个类,创建一个对象。它分配内存并调用构造方法(如果已定义)。对象在 PHP 中是引用类型,与基本类型不同。
语法:$object = new ClassName();
。如果没有传递参数,则括号是可选的。new 操作符返回对创建的对象的引用。
构造函数是在实例化期间调用的特殊方法。它们通常初始化对象属性。析构函数在对象被销毁时进行清理。
基本对象实例化
此示例演示了使用 new 关键字创建简单对象。
<?php declare(strict_types=1); class Car { public string $model; } $myCar = new Car(); $myCar->model = "Toyota"; echo "Car model: " . $myCar->model;
代码定义了一个简单的 Car 类,该类具有一个属性。new 关键字创建一个存储在 $myCar 中的 Car 实例。然后我们设置 model 属性并显示它。这显示了基本的对象创建和属性访问。
带参数的构造函数
此示例显示了如何在实例化期间将参数传递给构造函数。
<?php declare(strict_types=1); class Person { public function __construct( public string $name, public int $age ) {} } $person = new Person("John Doe", 30); echo "Name: {$person->name}, Age: {$person->age}";
Person 类有一个构造函数,该构造函数接受 name 和 age 参数。new 关键字在实例化期间传递这些值。构造函数属性提升自动创建属性。这是现代 PHP 中常见的一种模式。
多个对象实例
此示例演示了创建同一类的多个实例。
<?php declare(strict_types=1); class Product { public function __construct( public string $name, public float $price ) {} } $product1 = new Product("Laptop", 999.99); $product2 = new Product("Mouse", 19.99); echo "{$product1->name}: \${$product1->price}\n"; echo "{$product2->name}: \${$product2->price}";
我们创建了两个具有不同属性的独立 Product 对象。每个 new 调用都会创建一个不同的对象实例。这些对象是独立的,具有自己的属性值。这展示了类如何充当蓝图。
匿名类
此示例展示了如何将 new 与匿名类(没有名称的类)一起使用。
<?php declare(strict_types=1); $logger = new class { public function log(string $message): void { echo "Log: $message"; } }; $logger->log("System started");
new 关键字直接创建一个匿名类实例。该类有一个方法,我们立即调用它。匿名类对于一次性对象很有用。它们经常用于测试和依赖注入。
类继承
此示例演示了将 new 与继承类一起使用。
<?php declare(strict_types=1); class Animal { public function __construct(public string $species) {} } class Dog extends Animal { public function bark(): string { return "Woof!"; } } $dog = new Dog("Canine"); echo "Species: {$dog->species}, Sound: {$dog->bark()}";
Dog 继承自 Animal,但使用 new Dog 实例化。自动调用 Animal 的构造函数。我们可以访问父类和子类的成员。这展示了多态性。
静态工厂方法
此示例展示了使用静态工厂方法替代 new。
<?php declare(strict_types=1); class User { private function __construct(public string $name) {} public static function create(string $name): self { return new self($name); } } $user = User::create("Alice"); echo "User: {$user->name}";
构造函数是私有的,强制使用 create() 方法。工厂方法在内部使用 new 来实例化类。这提供了对对象创建的更多控制。这是面向对象编程中常见的设计模式。
对象克隆
此示例演示了通过对象克隆间接使用 new。
<?php declare(strict_types=1); class Book { public function __construct( public string $title, public string $author ) {} } $book1 = new Book("PHP Basics", "John Smith"); $book2 = clone $book1; $book2->title = "Advanced PHP"; echo "Book1: {$book1->title}, Book2: {$book2->title}";
我们首先使用 new 创建一个 Book 对象。clone 关键字创建一个副本,而无需调用构造函数。clone 操作在内部使用类似于 new 的内存分配。克隆后,这两个对象是独立的。
最佳实践
- 依赖注入: 倾向于注入依赖项,而不是直接使用 new。
- 单一职责: 类应该只有一个改变的原因。
- 类型提示: 对构造函数参数使用类型提示。
- 不可变对象: 尽可能考虑使对象不可变。
- 文档: 记录构造函数参数及其类型。
来源
本教程涵盖了 PHP 的 new 关键字,并提供了实际示例,展示了在各种场景和模式下进行对象实例化。
作者
列出 所有 PHP 教程。