ZetCode

PHP object 关键字

最后修改于 2025 年 4 月 16 日

PHP object 关键字用于对象的类型提示和类型声明。它确保一个值是对象实例。这有助于代码清晰,并防止与类型相关的错误。

基本定义

object 类型表示 PHP 中的任何对象实例。它是在 PHP 7.2 中作为正式类型声明引入的。它可以在参数、返回值和属性类型声明中使用。

使用 object 进行类型提示可确保函数接收到正确的对象参数。它适用于任何对象,无论其类是什么。这提供了灵活性,同时保持了类型安全。

object 类型与特定于类的类型提示不同。它接受任何对象实例,而类提示仅接受该类。

基本对象类型提示

此示例演示了将 object 用作参数类型提示。

basic_object.php
<?php

declare(strict_types=1);

function processObject(object $obj): void {
    echo "Processing object of class: " . get_class($obj);
}

$user = new stdClass();
processObject($user);

函数 processObject 需要一个对象参数。它接受任何对象实例,用 stdClass 演示。该函数使用 get_class 来显示对象的类名。

返回对象类型

此示例展示了如何将 object 指定为返回类型。

return_object.php
<?php

declare(strict_types=1);

function createUser(): object {
    $user = new stdClass();
    $user->name = "John";
    $user->age = 30;
    return $user;
}

$user = createUser();
echo "{$user->name} is {$user->age} years old.";

createUser 函数返回一个 object 类型。它创建并返回一个带有属性的 stdClass 实例。然后,调用代码可以访问这些属性。返回类型确保仅返回对象。

对象在类属性中

此示例演示了将 object 用作属性类型。

property_object.php
<?php

declare(strict_types=1);

class Logger {
    private object $writer;

    public function setWriter(object $writer): void {
        $this->writer = $writer;
    }

    public function log(string $message): void {
        $this->writer->write($message);
    }
}

$fileWriter = new class {
    public function write(string $message): void {
        file_put_contents('log.txt', $message, FILE_APPEND);
    }
};

$logger = new Logger();
$logger->setWriter($fileWriter);
$logger->log("Error occurred\n");

Logger 类使用 object 类型属性作为其 writer。匿名类实现了所需的 write 方法。这演示了灵活的依赖注入,同时保持了类型安全。

object 与特定类

此示例比较了 object 类型与特定类类型提示。

object_vs_class.php
<?php

declare(strict_types=1);

class User {
    public string $name;
}

function acceptObject(object $obj): void {
    echo "Accepted object of class: " . get_class($obj);
}

function acceptUser(User $user): void {
    echo "Accepted User: {$user->name}";
}

$user = new User();
$user->name = "Alice";

acceptObject($user);  // Works
acceptUser($user);    // Works

$std = new stdClass();
acceptObject($std);   // Works
// acceptUser($std);  // Would fail

acceptObject 函数接受任何对象,而 acceptUser 仅接受 User 实例。这显示了通用 object 和特定类类型提示之间的灵活性差异。

object 与 instanceof

此示例演示了使用 instanceof 检查对象类型。

object_instanceof.php
<?php

declare(strict_types=1);

interface LoggerInterface {
    public function log(string $message): void;
}

class FileLogger implements LoggerInterface {
    public function log(string $message): void {
        file_put_contents('app.log', $message, FILE_APPEND);
    }
}

function processLogger(object $logger): void {
    if ($logger instanceof LoggerInterface) {
        $logger->log("Processing started\n");
        echo "Logger is valid.";
    } else {
        echo "Invalid logger provided.";
    }
}

$fileLogger = new FileLogger();
processLogger($fileLogger);

该函数接受任何对象,但检查 LoggerInterface。这结合了 object 类型的灵活性和运行时接口验证。当您需要验证功能时,这很有用。

对象在数组中

此示例展示了使用对象数组。

object_array.php
<?php

declare(strict_types=1);

function processObjects(array $objects): void {
    foreach ($objects as $obj) {
        if ($obj instanceof object) {
            echo "Processing " . get_class($obj) . "\n";
        }
    }
}

$items = [
    new stdClass(),
    new DateTime(),
    new ArrayObject()
];

processObjects($items);

该函数处理一个包含各种对象的数组。在处理之前,会验证每个项目是否为对象。这对于异构对象集合很有用。使用正确的类型提示,instanceof 检查在技术上是多余的。

object 作为联合类型

此示例演示了在联合类型中使用 object。

object_union.php
<?php

declare(strict_types=1);

function stringOrObject(string|object $input): void {
    if (is_object($input)) {
        echo "Object: " . get_class($input);
    } else {
        echo "String: $input";
    }
}

stringOrObject("Hello");
stringOrObject(new stdClass());

该函数接受字符串或对象。联合类型提供了灵活性,同时保持了类型安全。在函数内部,我们检查实际类型以适当地处理每种情况。

最佳实践

来源

PHP object 类型文档

本教程通过实际示例介绍了 PHP object 关键字,展示了它在各种场景中的用法,以实现灵活的对象处理。

作者

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

列出 所有 PHP 教程