ZetCode

PHP new 关键字

最后修改于 2025 年 4 月 16 日

PHP 的 new 关键字是面向对象编程的基础。它创建一个类的实例,为对象分配内存。new 操作符调用类的构造函数来初始化对象。理解 new 对于在 PHP 中使用对象至关重要。

基本定义

new 关键字实例化一个类,创建一个对象。它分配内存并调用构造方法(如果已定义)。对象在 PHP 中是引用类型,与基本类型不同。

语法:$object = new ClassName();。如果没有传递参数,则括号是可选的。new 操作符返回对创建的对象的引用。

构造函数是在实例化期间调用的特殊方法。它们通常初始化对象属性。析构函数在对象被销毁时进行清理。

基本对象实例化

此示例演示了使用 new 关键字创建简单对象。

basic_new.php
<?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 属性并显示它。这显示了基本的对象创建和属性访问。

带参数的构造函数

此示例显示了如何在实例化期间将参数传递给构造函数。

constructor_params.php
<?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 中常见的一种模式。

多个对象实例

此示例演示了创建同一类的多个实例。

multiple_instances.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 与匿名类(没有名称的类)一起使用。

anonymous_class.php
<?php

declare(strict_types=1);

$logger = new class {
    public function log(string $message): void {
        echo "Log: $message";
    }
};

$logger->log("System started");

new 关键字直接创建一个匿名类实例。该类有一个方法,我们立即调用它。匿名类对于一次性对象很有用。它们经常用于测试和依赖注入。

类继承

此示例演示了将 new 与继承类一起使用。

inheritance.php
<?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。

factory_method.php
<?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。

cloning.php
<?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 的内存分配。克隆后,这两个对象是独立的。

最佳实践

来源

PHP 对象文档

本教程涵盖了 PHP 的 new 关键字,并提供了实际示例,展示了在各种场景和模式下进行对象实例化。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程