在PHP中,可以使用一些第三方库或框架来实现类似于预定义注解的功能。例如”AllowDynamicProperties”、”ReturnTypeWillChange”和”SensitiveParameter”类,本教程将详细介绍这三个类。
一、AllowDynamicProperties
用于标记 class,允许动态属性。动态属性是指在运行时可以动态添加和访问的属性,而不是在类定义时静态声明的属性。
final class AllowDynamicProperties {
/* 方法 */
public __construct()
}
示例:
从 PHP 8.2.0 起弃用动态属性,因此在不使用此注解标记类的情况下使用动态属性将发出弃用通知。
<?php class DefaultBehaviour { } #[\AllowDynamicProperties] class ClassAllowsDynamicProperties { } $o1 = new DefaultBehaviour(); $o2 = new ClassAllowsDynamicProperties(); $o1->nonExistingProp = true; $o2->nonExistingProp = true; ?>
以上示例在 PHP 8.2 中的输出:
Deprecated: Creation of dynamic property DefaultBehaviour::$nonExistingProp is deprecated in file on line 10
二、ReturnTypeWillChange
大多数非 final 内部方法现在需要重写方法来声明兼容的返回类型,否则在继承验证期间会发出弃用通知。 如果由于 PHP 跨版本兼容性问题而无法为重写方法声明返回类型,可以添加 #[\ReturnTypeWillChange] 属性以消除弃用通知。
final class ReturnTypeWillChange {
/* 方法 */
public __construct()
}
三、SensitiveParameter
SensitiveParameter类用于标记敏感参数,如果出现在栈跟踪中,则应编辑其值。这种注解通常用于安全性相关的代码,比如处理用户输入、密码等敏感信息的函数或方法。
final class SensitiveParameter {
/* 方法 */
public __construct()
}
示例:
<?php
function defaultBehavior(
string $secret,
string $normal
) {
throw new Exception('Error!');
}
function sensitiveParametersWithAttribute(
#[\SensitiveParameter]
string $secret,
string $normal
) {
throw new Exception('Error!');
}
try {
defaultBehavior('password', 'normal');
} catch (Exception $e) {
echo $e, PHP_EOL, PHP_EOL;
}
try {
sensitiveParametersWithAttribute('password', 'normal');
} catch (Exception $e) {
echo $e, PHP_EOL, PHP_EOL;
}
?>
上述示例在 PHP 8.2 中的输出类似于:
Exception: Error! in example.php:7
Stack trace:
#0 example.php(19): defaultBehavior('password', 'normal')
#1 {main}
Exception: Error! in example.php:15
Stack trace:
#0 example.php(25): sensitiveParametersWithAttribute(Object(SensitiveParameterValue), 'normal')
#1 {main}

