PHP object 关键字
最后修改于 2025 年 4 月 16 日
PHP object 关键字用于对象的类型提示和类型声明。它确保一个值是对象实例。这有助于代码清晰,并防止与类型相关的错误。
基本定义
object 类型表示 PHP 中的任何对象实例。它是在 PHP 7.2 中作为正式类型声明引入的。它可以在参数、返回值和属性类型声明中使用。
使用 object 进行类型提示可确保函数接收到正确的对象参数。它适用于任何对象,无论其类是什么。这提供了灵活性,同时保持了类型安全。
object 类型与特定于类的类型提示不同。它接受任何对象实例,而类提示仅接受该类。
基本对象类型提示
此示例演示了将 object 用作参数类型提示。
<?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 指定为返回类型。
<?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 用作属性类型。
<?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 类型与特定类类型提示。
<?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 检查对象类型。
<?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 类型的灵活性和运行时接口验证。当您需要验证功能时,这很有用。
对象在数组中
此示例展示了使用对象数组。
<?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。
<?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());
该函数接受字符串或对象。联合类型提供了灵活性,同时保持了类型安全。在函数内部,我们检查实际类型以适当地处理每种情况。
最佳实践
- 特殊性: 尽可能优先使用特定的类/接口类型。
- 文档: 记录预期的对象功能。
- 验证: 使用 instanceof 进行必需的接口。
- 灵活性: 当您需要最大的灵活性时,使用 object。
- 现代 PHP: 与其他类型功能(如联合类型)结合使用。
来源
本教程通过实际示例介绍了 PHP object 关键字,展示了它在各种场景中的用法,以实现灵活的对象处理。
作者
列出 所有 PHP 教程。